git提交前检查

201 阅读2分钟

git提交前检查

需求解释

在使用git提交前检查提交内容是否符合指定的规则,不满足则提交失败。

提出背景

提出这个需求实际上是因为我自己有需要,我在代码开发时遇到这样一种情况:有一个文件里的部分代码,在开发环境需要不断变动来进行测试,但在生产环境对这部分代码有固定的几种写法。 这个文件没必要做成配置文件,但本人又比较粗心大意,经常出现把测试的代码提交上去,于是就有了这么个需求

具体需求举例

假设需要检查的文件是个json文件,路径为"src/config/config.json",并且你想要检查的属性是 keyToCheck。你希望这个属性的值不等于 value1value2value3

实现

原理

进行 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,在样例文件里编写是没有意义的

image.png

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 钩子脚本添加执行权限:

  1. 打开 Git Bash。

  2. 使用 cd 命令导航到你的 Git 仓库目录。

  3. 运行以下命令来更改 pre-commit 钩子的权限:

    bash复制
    chmod +x .git/hooks/pre-commit
    

效果

提交内容
{
    "keyToCheck":"value1"
}

提交结果

f234ff67374228c4986afd5c5237792.png