6

コミットされた各ファイルでスクリプトを実行するコミット後のフックの例をどこかで見ることができますか?

例えば。

git add file1
git add file2

git commit -am "my commit"

そしてフックが実行されます:

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

最善の方法は、このフックを実行するかどうかをコミットするコマンドにパラメーターを設定することです。git commit -X… このコミット後のフックを実行します。最終的には のようなエイリアスになりgit-commitxます。

インデックス内のファイルの pre-commit フックと同じバージョンはどうですか? ファイルの 1 つでスクリプトの実行が失敗した場合、コミットを中止できますか?

編集:

これが私が今持っているものです:

#!/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

各ファイルで実行するスクリプトが、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)。シェル スクリプトの終了ステータスは、実行した最後のコマンドの終了ステータスです。つまりphpmd、エラー ステータスで終了した場合、フック スクリプトは、それが pre-commit フックの場合、これにより 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 に答える