Как указано в в документации , перехваты после получения и обновления являются перехватчиками на стороне сервера, т.е. они запускаются на сервере в ответ на pu sh от клиента. То, что вы хотите, - это обратное, для которого, к сожалению, нет хука.
Поскольку вы упоминаете, что псевдоним команды не сработает, вы можете использовать функцию в качестве следующей лучшей вещи. Он получит аргументы, которые затем могут быть проверены.
git() { env git $* && [ "$1" = "fetch" -o "$1" = "pull" ] && ./update_script.sh; }
Необходимо соблюдать осторожность, когда такие команды слежки не вызывают бесконечной рекурсии. Внутри тела функции вы никогда не должны вызывать git
напрямую, так как это перезапустит функцию, а не команду git
. Я использовал env
для разрешения фактического двоичного файла git
, но использование абсолютного пути также сработало бы.
Обратите внимание, что на самом деле git fetch
получит новые теги и git pull
просто звонит git fetch
изнутри. Поэтому я включил обработку для fetch
и pull
. Также обратите внимание, что она будет скрывать команду git во всех репозиториях, поэтому ее необходимо будет расширить, если специальная обработка должна применяться только к конкретным c репозиториям.
В случае, если ваш update_script.sh
отслеживаемые в самом репозитории, по крайней мере, нужно знать о двух вещах:
- Любой, кто может сделать sh изменения в этот файл, по сути, будет включен для запускать произвольные команды на любом компьютере, где происходят операции извлечения.
- Поскольку команды
pull
или fetch
могут выполняться в любом месте рабочего дерева, а не только на верхнем уровне, путь должен быть сначала разрешено с помощью [env] git rev-parse --show-toplevel
.