Как запретить Git пропускать ловушку перед фиксацией при использовании git commit -a?

У нас есть этот репо для всех наших конфигов Puppet. Я написал следующее, чтобы проверить любые измененные файлы.pp и выйти из коммита, если проверка не удалась. Сценарий предварительной фиксации работает правильно при запуске git commit но git commit -a кажется, пропустить крюк вообще. Мы используем git commit -a исключительно так, это поведение немного нарушает условия сделки.

Я делаю что-то неправильно? В качестве альтернативы, что я могу сделать, чтобы дублировать поведение git commit -a в скрипте pre-commit?

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

1 ответ

Решение

Перехваты предварительной фиксации запускаются при каждой фиксации, даже если указана опция -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,

Другие вопросы по тегам