tak*_*hin 6 git bash scripting githooks
我可以在某处找到一个示例的post-commit钩子来在每个提交的文件上运行脚本吗?
例如.
git add file1
git add file2
git commit -am "my commit"
Run Code Online (Sandbox Code Playgroud)
并且钩子执行:
myscript -myparams "file1"
myscript -myparams "file2"
Run Code Online (Sandbox Code Playgroud)
最好的方法是使用参数来提交命令来运行这个钩子,例如.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 ----------------------------------------------
Run Code Online (Sandbox Code Playgroud)
假设您在每个文件上执行的脚本在一个参数失败时无法立即设置为失败,则无法使用该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
Run Code Online (Sandbox Code Playgroud)
但也许phpmd会为你做这个吗?从你的问题中无法理解,但如果确实如此,你所要做的就是确保它是钩子中的最后一个命令.管道的退出状态是it(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...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5450 次 |
| 最近记录: |