git-hook
Имя
git-hook — запуск хуков Git
Краткое описание
git hook run [--allow-unknown-hook-name] [--ignore-missing] [--to-stdin=<path>] [(-j|--jobs) <n>]
<hook-name> [-- <hook-args>]
git hook list [--allow-unknown-hook-name] [-z] [--show-scope] <hook-name> Описание
Интерфейс командной строки для запуска хуков Git (см. githooks[5]), предназначенный для использования другими командами Git, работающими со сценариями.
Эта команда анализирует файлы конфигурации по умолчанию на предмет групп настроек, например:
[hook "linter"] event = pre-commit command = ~/bin/linter --cpp20
В этом примере [hook "linter"] представляет один сценарий — ~/bin/linter --cpp20, — которым могут совместно пользоваться многие репозитории и даже несколько событий хуков, если это уместно.
Чтобы добавить независимый хук, который запускается при другом событии, например средство проверки орфографии сообщений коммитов, можно написать конфигурацию следующим образом:
[hook "linter"] event = pre-commit command = ~/bin/linter --cpp20 [hook "spellcheck"] event = commit-msg command = ~/bin/spellchecker
При такой конфигурации, когда вы выполняете git commit, сначала у ~/bin/linter --cpp20 будет возможность проверить файлы, которые нужно закоммитить (во время события хука pre-commit), а затем у ~/bin/spellchecker будет возможность проверить сообщение коммита (во время события хука commit-msg).
Команды запускаются в том порядке, в котором Git обнаруживает связанные с ними настройки hook.<friendly-name>.event при анализе конфигурации (см. git-config[1]). Можно добавить несколько настроек hook.linter.event, но допустимо только одно событие hook.linter.command — Git выбирает команду по принципу «последняя настройка имеет приоритет».
Поэтому, если вы хотите запускать линтер как при коммите, так и при отправке изменений, настройте его следующим образом:
[hook "linter"] event = pre-commit event = pre-push command = ~/bin/linter --cpp20
При такой конфигурации Git запустит ~/bin/linter --cpp20 перед созданием коммита (во время pre-commit), а также перед отправкой изменений (во время pre-push).
Если же вы хотите запускать линтер и средство обнаружения утечки секретов только во время события хука «pre-commit», настройте их следующим образом:
[hook "linter"] event = pre-commit command = ~/bin/linter --cpp20 [hook "no-leaks"] event = pre-commit command = ~/bin/leak-detector
При такой конфигурации перед созданием коммита (во время pre-commit) Git сначала запустит ~/bin/linter --cpp20, а затем — ~/bin/leak-detector. Принимая решение о продолжении создания коммита, Git оценит вывод каждой команды.
Полный список событий хуков, которые можно указать для hook.<friendly-name>.event, и описание вызова хуков при этих событиях см. в githooks[5].
Git игнорирует любые настройки hook.<friendly-name>.event, в которых указано неизвестное ему событие. Это сделано для того, чтобы инструменты-обертки Git могли использовать инфраструктуру хуков для запуска собственных хуков; дополнительные сведения см. в разделе «ОБЕРТКИ».
Как правило, если инструкции предлагают добавить сценарий в .git/hooks/<hook-event>, вместо этого его можно указать в конфигурации, выполнив:
git config set hook.<some-name>.command <path-to-script> git config set --append hook.<some-name>.event <hook-event>
Так вы сможете использовать сценарий в нескольких репозиториях. То есть cp ~/my-script.sh ~/project/.git/hooks/pre-commit можно заменить на:
git config set hook.my-script.command ~/my-script.sh git config set --append hook.my-script.event pre-commit
Подкоманды
- run
-
Запускает хуки, настроенные для <hook-name>, в порядке их обнаружения при анализе конфигурации. Хук из каталога хуков, соответствующий <hook-name> по умолчанию, запускается последним. Поддерживаемые имена хуков см. в githooks[5].
Любые позиционные аргументы для хука необходимо передавать после обязательного
--(или--end-of-options, см. gitcli[7]). Аргументы, которые могут ожидать хуки (если таковые имеются), описаны в githooks[5]. - list [-z] [--show-scope]
-
Выводит список хуков, которые будут запущены при событии <hook-name>. Если для этого события не настроено ни одного хука, выводит предупреждение и возвращает 1. Используйте
-z, чтобы завершать строки вывода нулевым байтом вместо символа новой строки.
Параметры
- --allow-unknown-hook-name
-
По умолчанию команды
githookrunиgithooklistзавершатся с ошибкой, если Git не знает событие хука <hook-name> (список известных хуков см. в githooks[5]). Это помогает выявлять опечатки, напримерprereceiveвместо предполагаемогоpre-receive. Передайте этот флаг, чтобы разрешить неизвестные имена хуков. - --to-stdin
-
Для команды «run»: указывает файл, содержимое которого будет передано в стандартный ввод хука. Хук получит весь файл от начала до конца.
- --ignore-missing
-
Игнорирует отсутствующие хуки и без вывода сообщений возвращает ноль. Используется инструментами, которым нужно вслепую однократно запустить хук, который может присутствовать или отсутствовать.
- -z
-
Завершает строки вывода команды «list» нулевым байтом вместо символа новой строки.
- --show-scope
-
Для команды «list»: добавляет перед понятным именем каждого настроенного хука область конфигурации, отделенную табуляцией (например,
local,global,system), используя стиль вывода командыgitconfig--show-scope. На традиционные хуки из каталога хуков это не влияет. - -j
- --jobs
-
Допустим только для
run.Указывает, сколько хуков запускать одновременно. Если этот флаг не указан, используется значение настройки
hook.jobs; см. git-config[1]. Если не указано ни то ни другое, по умолчанию используется 1 (последовательное выполнение).Если значение больше 1, оно переопределяет настройку
hook.<friendly-name>.parallelдля отдельных хуков, позволяя всем хукам этого события выполняться одновременно, даже если для них не задано параллельное выполнение.Некоторые хуки всегда выполняются последовательно независимо от этого флага и настройки
hook.jobs, поскольку Git знает, что их нельзя безопасно запускать параллельно:applypatch-msg,pre-commit,prepare-commit-msg,commit-msg,post-commit,post-checkoutиpush-to-checkout.
Обертки
git hook run разработана так, чтобы инструменты-обертки Git могли легко настраивать и запускать хуки с помощью инфраструктуры хуков Git. Можно передавать аргументы и стандартный ввод через командную строку, а также задавать параллельное или последовательное выполнение, если пользователь настроил несколько хуков.
Предположим, ваша обертка должна поддерживать хук с именем «mywrapper-start-tests». Пользователи могут указать свои хуки следующим образом:
[hook "setup-test-dashboard"] event = mywrapper-start-tests command = ~/mywrapper/setup-dashboard.py --tap
Затем в инструменте mywrapper можно вызвать любые хуки, настроенные пользователями, выполнив:
git hook run --allow-unknown-hook-name mywrapper-start-tests \ # providing something to stdin --stdin some-tempfile-123 \ # execute multiple hooks in parallel --jobs 3 \ # plus some arguments of your own... -- \ --testname bar \ baz
Выбирайте названия событий хуков для своей обертки так, чтобы они как можно меньше пересекались с встроенными хуками Git (см. githooks[5]): вероятность того, что Git добавит встроенное событие хука с именем mywrappertool-validate-commit, гораздо ниже, чем для события с именем validate-commit. Если Git начнет использовать событие хука с тем же именем, что и хук вашей обертки, он может вызывать хуки пользователей непредусмотренным и неподдерживаемым образом.
Конфигурация
- hook.<friendly-name>.command
-
Команда, выполняемая для
hook.<friendly-name>. <friendly-name> — уникальное имя, идентифицирующее этот хук. События хуков, запускающие команду, задаются настройкамиhook.<friendly-name>.event. Значением может быть путь к исполняемому файлу или однострочная команда оболочки. Если для одного и того же <friendly-name> указано несколько значений, используется только последнее разобранное значение. - hook.<friendly-name>.event
-
События хуков, запускающие
hook.<friendly-name>. Значение — имя события хука, например «pre-commit» или «update». (Полный список событий хуков см. в githooks[5].) При наступлении указанного события выполняется связанная настройкаhook.<friendly-name>.command. Этот ключ может иметь несколько значений. Чтобы запускатьhook.<friendly-name> при нескольких событиях, укажите ключ несколько раз. Пустое значение сбрасывает список событий, удаляя все ранее заданные события дляhook.<friendly-name>.<friendly-name> не должно совпадать с именем известного события хука (например, не используйте
hook.pre-commit.event). Использование имени известного события в качестве понятного имени приводит к фатальной ошибке, поскольку создает неоднозначность с настройкамиhook.<event>.enabledиhook.<event>.jobs. Для неизвестных имен событий выдается предупреждение, если <friendly-name> совпадает со значением события. - hook.<friendly-name>.enabled
-
Определяет, включен ли хук
hook.<friendly-name>. По умолчанию —true. Установите значениеfalse, чтобы отключить хук, не удаляя его конфигурацию. Это особенно полезно, когда хук задан в системном или глобальном файле конфигурации, но его нужно отключить для конкретного репозитория. - hook.<friendly-name>.parallel
-
Определяет, может ли хук
hook.<friendly-name> выполняться параллельно с другими хуками для того же события. По умолчанию —false. Установите значениеtrueтолько в том случае, если сценарий хука можно безопасно выполнять одновременно с другими хуками для того же события. Если для какого-либо хука события значение не равноtrue, все хуки этого события выполняются последовательно независимо от настройкиhook.jobs. Эту настройку нужно задавать только для настроенных (именованных) хуков. Для традиционных хуков из каталога хуков это не требуется: они выполняются параллельно, если эффективное число заданий больше 1. - hook.<event>.enabled
-
Включает или отключает все хуки для события хука <event>. Если задано значение
false, для этого события не запускается ни один хук, независимо от настроекhook.<friendly-name>.enabledотдельных хуков. По умолчанию —true.Примечание об именовании: <event> должно быть именем события (например,
pre-commit), а не понятным именем хука. Поскольку использовать имя известного события в качестве понятного имени запрещено (см. описаниеhook.<friendly-name>.eventвыше), настройки.enabledдля известного события на уровне события и отдельного хука не могут быть неоднозначными. Для неизвестных событий, если понятное имя совпадает с именем события вопреки предупреждению, настройка.enabledтрактуется только как настройка отдельного хука. - hook.<event>.jobs
-
Задает количество хуков, которые можно одновременно запускать для события хука <event> (например,
hook.post-receive.jobs=4). Переопределяетhook.jobsдля этого конкретного события. Действуют те же ограничения параллельного выполнения: эта настройка не влияет на выполнение, если для всех настроенных хуков события значениеhook.<friendly-name>.parallelне равноtrue. Установите значение-1, чтобы использовать количество доступных ядер ЦП. Значение должно быть положительным целым числом или-1; ноль отклоняется с предупреждением.Примечание об именовании: хотя этот ключ похож на
hook.<friendly-name>.*(настройку отдельного хука), <event> должно быть именем события, а не понятным именем хука. Компонент ключа сохраняется буквально, а во время выполнения поиск выполняется по имени события без преобразования между двумя пространствами имен. Ключ видаhook.my-hook.jobsсохраняется как"my-hook", но во время выполнения поиск производится по имени события (например,"post-receive"), поэтомуhook.my-hook.jobsмолча игнорируется, даже если для этого события зарегистрированоmy-hook. Для настройкиhook.<event>.jobsиспользуйтеhook.post-receive.jobsили любое другое допустимое имя события. - hook.jobs
-
Задает количество хуков, которые можно одновременно запускать при параллельном выполнении хуков. Если значение не указано, по умолчанию используется 1 (последовательное выполнение). Установите значение
-1, чтобы использовать количество доступных ядер ЦП. Значение можно переопределить отдельно для каждого события с помощьюhook.<event>.jobs. Некоторые хуки всегда выполняются последовательно независимо от этой настройки, поскольку они работают с общими данными и не могут безопасно выполняться параллельно:-
applypatch-msg -
prepare-commit-msg -
commit-msg -
Получают файл сообщения коммита и могут изменять его на месте.
-
pre-commit -
post-checkout -
push-to-checkout -
post-commit -
Получают доступ к рабочему дереву, индексу или состоянию репозитория.
Эта настройка не влияет на выполнение, если для всех настроенных хуков события значение
hook.<friendly-name>.parallelне равноtrue.Для хуков
pre-push, которые обычно выводят stdout и stderr отдельно, установка значения больше 1 (или передача-j) объединит stdout со stderr, чтобы обеспечить корректное разделение параллельного вывода. -
См. также
hook
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-hook