git post-commit hook - 提交文件上的脚本

时间:2010-09-01 09:32:26

标签: git bash scripting githooks

我可以在某个地方看到一个示例的提交后挂钩,以便在每个已提交的文件上运行脚本吗?

例如。

git add file1
git add file2

git commit -am "my commit"

并且钩子执行:

myscript -myparams "file1"
myscript -myparams "file2"

最好的是使用参数来提交命令来运行这个钩子,例如。 git commit -X ...执行此帖子提交挂钩。最后是git-commitx等别名。

与索引中文件的预提交挂钩相同的版本怎么样?当其中一个文件执行脚本失败时,我可以中止提交吗?

编辑:

以下是我现在所拥有的:

#!/bin/sh                                     
#.git/hooks/post-commit
dir=`pwd`
echo ----------------------------------------------
echo PHP Mess Detector results for commited files:
echo ----------------------------------------------
git show --pretty="format:" --name-only  | grep '\.php$' | xargs -i phpmd $dir/'{}' text codesize,unused$
echo ----------------------------------------------

1 个答案:

答案 0 :(得分:6)

假设您在每个文件上执行的脚本在一个参数失败时无法立即设置为失败,则无法使用该xargs设置。你可以这样做:

#!/bin/bash

# for a pre-commit hook, use --cached instead of HEAD^ HEAD
IFS=$'\n'
git diff --name-only HEAD^ HEAD | grep '\.php$' |
while read file; do
    # exit immediately if the script fails
    my_script "$file" || exit $?
done

但也许phpmd会为你做这件事吗?从你的问题中无法理解,但如果确实如此,你所要做的就是确保它是钩子中的最后一个命令。管道的退出状态是其中最后一个命令的退出状态(phpmd),并且shell脚本的退出状态是它运行的最后一个命令的退出状态 - 所以如果phpmd以错误状态退出,钩子脚本将,如果它是预提交钩子,这将导致git中止提交。

至于git-commit来控制这个钩子的调用的选项,你有点不走运,除非你认为--no-verify(它抑制所有提交钩子)足够好。别名......最干净的方法是在别名中设置环境变量,可能是:

# gitconfig
[alias]
    commitx = "!run_my_hook=1; git commit"

# your script
#!/bin/bash
# if the variable's empty, exit immediately
if [ -z "$run_my_hook" ]; then
    exit 0;
fi
# rest of script here...