Можно ли управлять скриптами Git hook вместе с хранилищем? - PullRequest
266 голосов
/ 09 января 2009

Мы хотели бы сделать несколько основных скриптов-хуков, которыми мы все можем поделиться - для таких вещей, как предварительное форматирование сообщений коммита. В Git есть скрипты хуков, которые обычно хранятся в <project>/.git/hooks/. Однако эти сценарии не распространяются, когда люди делают клон, и они не контролируются версией.

Есть ли хороший способ помочь всем получить правильные скрипты? Могу ли я просто сделать так, чтобы эти скрипты хуков указывали на скрипты с контролем версий в моем репо?

Ответы [ 11 ]

0 голосов
/ 23 апреля 2019

В идеале хуки должны быть написаны на 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-хуков абсолютно фантастично, но то, как они предлагаются, обычно только отвлекает от них людей.

...