Как выполнить команду сразу после команды fetch или pull в git? - PullRequest
29 голосов
/ 11 апреля 2011

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

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

Ответы [ 2 ]

27 голосов
/ 11 апреля 2011

Если вам нужно выполнить скрипт после git pull на стороне клиента (на вашем компьютере), то надежного решения не существует.

хук на стороне клиента после слияния ( упомянутое здесь ) не будет срабатывать при каждом извлечении (например, не при перебазировании по вытягиванию, не в случае слияния с перемоткой вперед)

Таким образом, псевдоним, заключающий в себе обаКоманды остаются возможным обходным путем.


Оригинальный ответ (2011)

Если вам это нужно на стороне сервера, где вы бы извлекли пустое хранилище и извлекли из рабочего дерева (включеносервер) после каждого нажатия на репо (на сервере):

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

Недостает часть: где that hook выполняется сам по себе?

Сообщение в блоге " Документация об отсутствующих git hooks * " от (великого) 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» ), , что почти наверняка не то, что вам нужно .

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

16 голосов
/ 24 января 2014

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

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

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

...