Сценарий предварительной фиксации создает файл mysqldump, но "ничего не фиксируется (рабочий каталог очищен)"?

Я использую скрипт.git/hooks/pre-commit для создания снимков базы данных MySQL вместе с другими файлами проекта. Вот содержимое:

#!/bin/bash
mysqldump -u user -ppassword --skip-extended-insert dbname > /path/to/repo/dbname.sql
cd /mnt/hoste/Storage/Code/test-repo/
git add /path/to/repo/dbname.sql

Если я бегу:

git commit -am "Message"

Создается новый файл дампа, но затем git сообщает мне:

nothing to commit (working directory clean)

Затем, если я снова запускаю идентичную команду commit, она работает:

1 file changed, 1 insertion(+), 1 deletion(-)

Затем, если я снова выполню идентичную команду, вернемся к "ничего не фиксировать". Этот паттерн продолжается до бесконечности - работает, не работает, работает, не работает. Это не основано на времени (я попытался зафиксировать сразу и ждать 10 минут). Mysqldump, безусловно, обновляет файл.sql (дата помечает их в формате чч: мм: сс в конце файла).

Если я возьму скрипт и запускаю его построчно в командной строке (включая первый cd'ing в каталог hooks, чтобы полностью имитировать запуск скрипта), каждый раз появляется новый коммит. Если я помещаю его в исполняемый файл в хуках, или в корень репо, и запускаю его из командной строки, а затем запускаю команду commit, он работает каждый раз. Он не работает только через раз, и только тогда, когда он запускается из предварительной фиксации.

Что может быть причиной этого странного поведения?

2 ответа

Решение

В ловушке, убедитесь, что всегда указали git_dir и work_tree:

git --git-dir=/path/to/your/repo/.git --work-tree=/path/to/your/repo add -- yourFile

Изменяя папку в хуке, вы не меняете то, что было текущим git-репо. Если предполагается, что этот репо изменится, лучше всего явно указать на него --git-dir вариант.

Я наблюдаю, что перехват "pre-commit" происходит после того, как git "заморозил" список файлов, на которые нужно воздействовать (т. Е. Выбрал адресуемое по содержимому имя состояния репозитория), и на него нельзя повлиять; вместо этого "git add" в хуке pre-commit вносит изменения в индекс, который вступит в силу после завершения коммита, и, таким образом, следующий "git commit" показывает результат "git add" внутри pre совершить мерзавец

Более подробное обсуждение здесь: можно ли повторно подготовить файлы в git-хуке перед фиксацией?

В моих попытках сделать "git add" в моем собственном хуке pre-commit (я также хотел автоматически сгенерировать и "git add" некоторые файлы в мой коммит), я пробовал различные трюки с рекурсивными вызовами git- совершать, но все заканчивается тем, что он действительно уродлив и делает бесполезные жалобы. Я собираюсь отказаться от своих ловушек / попыток предварительной фиксации, и вместо этого использовать псевдоним оболочки, который выполняет "stuff && git add things && git commit".

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