git提交前检查
需求解释
在使用git提交前检查提交内容是否符合指定的规则,不满足则提交失败。
提出背景
提出这个需求实际上是因为我自己有需要,我在代码开发时遇到这样一种情况:有一个文件里的部分代码,在开发环境需要不断变动来进行测试,但在生产环境对这部分代码有固定的几种写法。 这个文件没必要做成配置文件,但本人又比较粗心大意,经常出现把测试的代码提交上去,于是就有了这么个需求
具体需求举例
假设需要检查的文件是个json文件,路径为"src/config/config.json",并且你想要检查的属性是 keyToCheck。你希望这个属性的值不等于 value1、value2 或 value3。
实现
原理
进行 Git 提交之前,可以通过配置 Git Hooks 来实现拦截。Git Hooks 是一种脚本,可以在特定的 Git 事件之前或之后运行,例如在提交前(pre-commit)或提交后(post-commit)。
步骤
1. 定位到 Git 钩子目录
打开你的项目目录,找到 .git/hooks 文件夹。
2. 创建或编辑 pre-commit 钩子
在 .git/hooks 目录中,创建或编辑名为 pre-commit 的文件。确保该文件具有执行权限。注意.git文件夹自带的是样例文件pre-commit.sample,在样例文件里编写是没有意义的
3. 确保 jq 已安装
jq是一个轻量级且灵活的命令行 JSON 处理器。你需要确保它已经安装在你的系统上。你可以从 jq 的官网下载并安装它。- 如果你在 Windows 上使用 Git Bash 或者 WSL(Windows Subsystem for Linux),你可以使用 curl 命令下载
jq的 Windows 执行文件,并将其放置在可执行路径下:
复制
curl -L -o /usr/bin/jq.exe https://github.com/stedolan/jq/releases/latest/download/jq-win64.exe
这将下载最新的 jq 执行文件并放置在 Git Bash 的 /usr/bin/ 目录下,使其能够直接调用1。
4. 更新 pre-commit 钩子脚本
修改脚本以使用正确的文件路径,并使用 jq 来解析 JSON 文件并检查属性值。记得改完保存并退出编辑器。
bash复制
#!/bin/sh
# 完整的相对路径到 config.json 文件
CONFIG_FILE="src/config/config.json"
# 检查 config.json 文件是否被暂存
if git diff --cached --name-only --diff-filter=d | grep -q "$CONFIG_FILE"; then
# 使用 jq 获取 keyToCheck 的值
VALUE=$(git show :"$CONFIG_FILE" | jq -r '.keyToCheck')
# 定义不希望等于的值的数组
INVALID_VALUES=("value1" "value2" "value3")
# 检查值是否等于不希望的值
for invalid_value in "${INVALID_VALUES[@]}"; do
if [ "$VALUE" = "$invalid_value" ]; then
echo "Error: The value of keyToCheck in $CONFIG_FILE is not allowed to be '$VALUE'."
exit 1
fi
done
echo "The value of keyToCheck in $CONFIG_FILE is valid."
else
echo "$CONFIG_FILE is not staged for commit or has not changed."
fi
5 执行 chmod 命令
在项目根目录下,执行以下命令来为 pre-commit 钩子脚本添加执行权限:
-
打开 Git Bash。
-
使用
cd命令导航到你的 Git 仓库目录。 -
运行以下命令来更改
pre-commit钩子的权限:bash复制 chmod +x .git/hooks/pre-commit
效果
提交内容
{
"keyToCheck":"value1"
}