3

すべての Puppet 構成用にこのレポがあります。変更された .pp ファイルを検証し、検証が失敗した場合はコミットから抜け出すために、次のように記述しました。pre-commit スクリプトは、によってトリガーされたときに適切に実行されますgit commitgit commit -a、フックを完全にスキップするようです。排他的に使用するgit commit -aため、この動作は少し問題になります。

私は何か間違ったことをしていますか?または、コミット前スクリプトで git commit -a の動作を複製するにはどうすればよいですか?

#!/bin/bash
# check puppet files for errors before pushing to repo
for name in `git diff --name-only`; do
    if [[ $name == *.pp ]]; then
        path="$(pwd)/$name"
        puppet parser validate "$path"
        r=$?
        if [ $r -ne 0 ]; then exit 1; fi
    fi
done
4

1 に答える 1

4

-a オプションが指定されている場合でも、コミット前フックはすべてのコミットで実行されます。次のスクリプトを作成して確認します。

#!/bin/bash
echo "Running"

スクリプトを に配置し.git/hooks/pre-commit、ファイルを編集およびステージングしてから、次の操作を行います。

$ git commit -am "Commit"
Running
[master f042adf] Commit
 1 file changed, 1 insertion(+), 1 deletion(-)

git diffデフォルトでは、ステージングされていない変更と比較します。たとえば、README.md を次のように編集します。

$ git diff --name-only
README.md
$ git add -A
$ git diff --name-only
$

変更がステージングされると、それらは に表示されなくなりgit diffます。

-a オプションはgit commit、pre-commit フックを実行する前に変更をステージングします。たとえば、pre-commit フックを次のように変更するとします。

#!/bin/bash
echo "Running"
git diff --name-only

README.mdもう一度編集してから、次のようにします。

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
$ .git/hooks/pre-commit
Running
README.md
$ git commit -m "Commit"
Running
README.md
On branch master
Changes not staged for commit:
    modified:   README.md

no changes added to commit

変更は差分出力に表示されましたが、コミットされませんでした。しかし:

$ git commit -am "Commit"
Running
[master a357465] Commit
 1 file changed, 1 insertion(+), 1 deletion(-)

今回は、-a オプションを使用して、差分出力に変更が表示されませんでしたが (ステージ上にあったため)、コミットされました。

したがって、コマンドに--cachedオプションを追加します。git diff

#!/bin/bash
echo "Running"
git diff --name-only --cached

次に、に別の変更を加えた後README.md

$ git commit -am "Commit"
Running
README.md
[master eaab554] Commit
 1 file changed, 1 insertion(+), 1 deletion(-)

答えは の--cachedオプションgit diffです。

于 2014-05-10T19:10:32.857 に答える