代码之家  ›  专栏  ›  技术社区  ›  takeshin

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

  •  6
  • takeshin  · 技术社区  · 15 年前

    我可以在某个地方看到一个示例post commit hook来对每个提交的文件运行脚本吗?

    如。

    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 回复  |  直到 13 年前
        1
  •  6
  •   Cascabel    15 年前

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