3

我们所有的 Puppet 配置都有这个 repo。我编写了以下内容来验证任何更改的 .pp 文件,并在验证失败时退出提交。预提交脚本在触发时正常运行,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 钩子更改为:

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

于 2014-05-10T19:10:32.857 回答