Хуки - виконувані скрипти, які Git запускає в певні моменти: перед комітом, після checkout, перед push. Лежать у .git/hooks/ (Git створює там приклади з суфіксом .sample) і мають бути виконуваними (chmod +x).
Клієнтські хуки, які використовують найчастіше:
| Хук | Коли | Типове використання |
|---|---|---|
pre-commit |
перед створенням коміту | форматування, лінтер, швидкі перевірки |
prepare-commit-msg |
перед відкриттям редактора повідомлення | підставити номер задачі з назви гілки |
commit-msg |
після введення повідомлення | перевірити формат (Conventional Commits) |
post-checkout |
після checkout/switch |
оновити залежності, очистити кеш |
pre-push |
перед відправкою на сервер | запустити тести |
Ненульовий код виходу скасовує операцію - так pre-commit може заборонити коміт:
#!/bin/sh
# .git/hooks/pre-commit
vendor/bin/pint --test || {
echo "Код не відформатовано. Запустіть vendor/bin/pint"
exit 1
}
Що отримують хуки:
commit-msg- шлях до файла з повідомленням коміту (першим аргументом);pre-push- назву й адресу віддаленого репозиторію в аргументах, а в стандартному вводі - рядки з посиланнями й SHA, які відправляються.
Важливі обмеження:
.git/hooksне потрапляє в репозиторій - хуки не поширюються командою автоматично (для цього -core.hooksPathчи інструменти на кшталт Husky і CaptainHook);- хуки легко обійти:
git commit --no-verify(чи-n) пропускаєpre-commitіcommit-msg,git push --no-verify-pre-push. Тому хуки - зручність для розробника, а гарантію дає CI; - хуки мають бути швидкими:
pre-commitна хвилину - і люди почнуть використовувати--no-verifyпостійно. Повний набір тестів - уpre-pushчи CI.