Как выполнить команду сразу после команды извлечения или вытягивания в git?

Я клонировал репозиторий GHC (Glasgow Haskell Compiler). Для создания компилятора вам нужны несколько библиотек, все они доступны как хранилища git. Чтобы облегчить жизнь, хакеры GHC включали script sync-all, который при выполнении обновляет все зависимые репозитории.

Теперь на мой вопрос: как я могу сделать git execute ./sync-all pull после того, как я сделал git pull автоматически? Я слышал что-то об использовании крючков, но я действительно не знаю, что я должен делать.

Ответ 1

A post-receive или post-update обычно используется для такого рода задач, выполняемых после каждого нажатия. Разница между крючками post-receive и post-update заключается в аргументах: a post-receive получит как старые, так и новые значения всех ссылок в дополнение к их именам.

Пропущенный фрагмент: , где этот крюк выполняет сам?

Сообщение в блоге " Отсутствует git документация с крючками" от (великого) вкладчика SO Mark Longair проливает свет на это:

текущим рабочим каталогом будет каталог git.

  • Итак, если это голый репозиторий под названием "/src/git/test.git/", это будет текущий рабочий каталог - если это не-голый репозиторий, а верхний уровень рабочего дерева - "/home/mark/test/", то текущий рабочий каталог будет "/home/mark/test/.git/"

Крис Джонсен подробно описывает его SO ответ: "Если указаны –-git-dir или GIT_DIR но ни один из -–work-tree, GIT_WORK_TREE и core.worktree не указан, текущий рабочий каталог рассматривается как верхний каталог вашего рабочего дерева."

Другими словами, ваше рабочее дерево также будет текущим каталогом (каталог ".git" ), который почти наверняка не является тем, что вы хотите.

Убедитесь, что ваш hook/post-receive script, после создания и создания исполняемого файла, устанавливает GIT_WORK_TREE по правильному пути, чтобы ваш ./sync-all pull выполнялся в правильном каталоге (т.е. не "xxx.git" один").

Ответ 2

Когда вы запустите git pull, git на самом деле делает выборку, за которой следует слияние. Это означает, что вы можете использовать hook post-merge для выполнения script при завершении pull.

Чтобы установить это, вам просто нужно создать исполняемый файл script в каталоге репозитория .git/hooks/ с именем post-merge.

Обратите внимание, что этот script не будет запущен, если слияние завершится неудачно из-за конфликтов.