В идеале хуки должны быть написаны на bash, если вы следуете файлам примеров. Но вы можете написать его на любом доступном языке и просто убедиться, что он имеет исполняемый флаг.
Таким образом, вы можете написать код Python или Go для достижения ваших целей и поместить его в папку hooks. Это будет работать, но не будет управляться вместе с хранилищем.
Два варианта
а) Несколько сценариев
Вы можете закодировать свои хуки внутри своей справки и добавить небольшой фрагмент кода в хуки, чтобы вызвать свой идеальный сценарий, например:
$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js
б) Один сценарий
Более крутой вариант - добавить только один скрипт, чтобы управлять ими всеми, вместо нескольких. Итак, вы создаете hooks / mysuperhook.go и указываете на него все нужные вам крючки.
$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/mysuperhook.go $(basename $0)
Параметр предоставит вашему скрипту, какой хук был запущен, и вы можете различить его внутри своего кода. Зачем? Иногда, возможно, вы захотите выполнить одну и ту же проверку для коммита и толчка.
А потом?
Тогда вы можете захотеть иметь дополнительные функциональные возможности, такие как:
- Запустите ловушку вручную, чтобы проверить, все ли в порядке, даже до коммита или толчка. Если вы просто вызовете свой сценарий (опция a или b), то добьетесь цели.
- Запускает ловушки для CI, так что вам не нужно переписывать те же проверки для CI, это, например, будет просто вызывать триггеры commit и push. То же самое, что и выше, должно решить эту проблему.
- Вызовите внешние инструменты, такие как средство проверки уценки или средство проверки YAML. Вы можете делать системные вызовы и должны обрабатывать STDOUT и STDERR.
- Убедитесь, что у всех разработчиков есть простой способ установки хуков, поэтому нужно добавить хороший скрипт в репозиторий для замены хуков по умолчанию на правильные
- Имейте несколько глобальных помощников, таких как чек для блокировки коммитов для разработки и мастер веток, без необходимости добавлять его в каждый репозиторий. Вы можете решить эту проблему, имея другой репозиторий с глобальными скриптами.
Может ли это быть проще?
Да, есть несколько инструментов, которые помогут вам управлять git-hooks. Каждый из них предназначен для решения проблемы с разных точек зрения, и вам может понадобиться понять их все, чтобы получить тот, который лучше всего подходит для вас или вашей команды. GitHooks.com предлагает много чтения о перехвате и нескольких инструментах, доступных сегодня.
На сегодняшний день там перечислены 21 проект с различными стратегиями управления git-хуками. Некоторые делают это только для одного хука, некоторые для определенного языка и т. Д.
Один из этих инструментов, написанный мной и предложенный бесплатно как проект с открытым исходным кодом, называется hooks4git . Он написан на Python (потому что он мне нравится), но идея состоит в том, чтобы обрабатывать все элементы, перечисленные выше, в одном файле конфигурации с именем .hooks4git.ini, который находится внутри вашего хранилища и может вызывать любой скрипт, который вы хотите вызвать, на любом языке. .
Использование git-хуков абсолютно фантастично, но то, как они предлагаются, обычно только отвлекает от них людей.