6

我可以在某处看到一个示例 post-commit 挂钩以在每个提交的文件上运行脚本吗?

例如。

git add file1
git add file2

git commit -am "my commit"

并且钩子执行:

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

最好是有参数来提交命令来运行这个钩子,例如。git commit -X… 执​​行这个 post commit 钩子。最终像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 ----------------------------------------------
4

1 回答 1

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的退出状态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...
于 2010-09-01T13:02:47.557 回答