即使指定了 -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 钩子更改为:
#!/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
更改显示在 diff 输出中,但未提交。但:
$ git commit -am "Commit"
Running
[master a357465] Commit
1 file changed, 1 insertion(+), 1 deletion(-)
这一次,使用 -a 选项,更改没有显示在 diff 输出中(因为它们在舞台上),但它们已提交。
因此,将--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
。