Сценарий предварительной фиксации создает файл 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".