-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
です。