【问题标题】:git post-commit hook - script on committed filesgit post-commit hook - 提交文件的脚本
【发布时间】:2011-04-06 17:01:53
【问题描述】:

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

例如。

git add file1
git add file2

git commit -am "my commit"

然后钩子执行:

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

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

【问题讨论】:

    标签: git bash scripting githooks


    【解决方案1】:

    假设您在每个文件上执行的脚本无法设置为在一个参数上失败时立即失败,则您不能使用该 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...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多