git precommit-hook: 检查行内容是否改变

git precommit-hook: check whether line content has changed

Szenario: 在使用 git 提交文件时,我想在预提交挂钩中检查某行是否已被修改。因此,我想将修改后的文件中的一行部分与存储库中的相应行部分进行比较。

背景: 我想确保要提交的文件的版本号不同于存储库中已有文件的版本号。应强制用户为文件提供适当的版本号。提交时自动增加版本号不是一个选项,因为我们使用多部分版本 (1.0.0.0),并且用户必须修改版本字符串的正确部分 ...

问题:是否可以在预提交挂钩中访问修改后的文件内容以及存储库文件?

答案是肯定的。

但是 - pre commit hook 是客户端挂钩,可以删除或删除,这就是为什么最好使用服务器端挂钩

这是一个示例挂钩,用于检查所需文件是否已被修改。 一旦您知道文件是否已提交,请使用此:

# you have the commit id so you can checkout the given file
git show <commit id>:<full path to file>

完整示例代码:

pre-receive hook

#!/bin/sh

# Check to see if this is the first commit in the repository or not
if git rev-parse --verify HEAD >/dev/null 2>&1
then
    # We compare our changes against the previous commit
    against=HEAD^
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

# Redirect output to screen.
exec 1>&2

# Check to see if we have updated the given file
if [ $(git diff-tree -r --name-only $against | grep <ANY FILE YOU WANT TO FIND OUT HERE> ) ];
then

    # you have the commit id so you can checkout the given file
    # the commit is: git rev-parse HEAD
    git show <commit id>:<full path to file>

    # personal touch :-)
    echo "                                         "
    echo "                   |ZZzzz                "
    echo "                   |                     "
    echo "                   |                     "
    echo "      |ZZzzz      /^\            |ZZzzz  "
    echo "      |          |~~~|           |       "
    echo "      |        |-     -|        / \      "
    echo "     /^\       |[]+    |       |^^^|     "
    echo "  |^^^^^^^|    |    +[]|       |   |     "
    echo "  |    +[]|/\/\/\/\^/\/\/\/\/|^^^^^^^|   "
    echo "  |+[]+   |~~~~~~~~~~~~~~~~~~|    +[]|   "
    echo "  |       |  []   /^\   []   |+[]+   |   "
    echo "  |   +[]+|  []  || ||  []   |   +[]+|   "
    echo "  |[]+    |      || ||       |[]+    |   "
    echo "  |_______|------------------|_______|   "
    echo "                                         "
    echo "                                         "
    echo "      You have just committed code       " 
    echo "      Your code is bad.!!!               "
    echo "      Do not ever commit again           "
    echo "                                         "
fi;

# set the exit code to 0 or 1 based upon your needs
# 0 = good to push
# 1 = exit without pushing.
exit 0;