Как запретить 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
,