Как настроить Git hooks для автоматизации перед коммитом и пушем
Git hooks — это простой, но мощный механизм автоматизации, встроенный прямо в Git. Они позволяют запускать произвольные скрипты на разных этапах работы с репозиторием: перед коммитом, перед пушем, после слияния и т.д. С их помощью можно автоматически проверять код, форматировать файлы, запускать тесты и предотвращать попадание ошибок в репозиторий.
В этой статье разберёмся, как работают Git hooks, какие из них используются чаще всего и как настроить автоматизацию перед commit и push.
Что такое Git hooks
Git hooks — это исполняемые скрипты, которые Git вызывает при наступлении определённых событий. Они хранятся в каталоге:
.git/hooks/
По умолчанию там лежат файлы с расширением .sample. Чтобы hook начал работать, нужно:
- убрать расширение
.sample; - сделать файл исполняемым.
Hooks выполняются локально и не попадают в репозиторий, что важно учитывать при работе в команде.
Когда используются Git hooks
На практике hooks применяются для:
- проверки стиля кода;
- запуска линтеров;
- выполнения тестов;
- валидации commit message;
- предотвращения push’а при ошибках.
Это позволяет ловить проблемы максимально рано — ещё до попадания кода в общий репозиторий.
Основные hooks для автоматизации
pre-commit
Срабатывает перед созданием коммита. Если hook завершится с ненулевым кодом, коммит будет отменён.
Типичные задачи:
- запуск линтера;
- форматирование кода;
- проверка конфигураций.
commit-msg
Вызывается после ввода сообщения коммита. Используется для проверки его формата (например, Conventional Commits).
pre-push
Срабатывает перед отправкой изменений в удалённый репозиторий. Часто используется для:
- запуска тестов;
- проверки сборки проекта;
- блокировки push’а в
mainбез условий.
Пример простого pre-commit hook
Создадим файл .git/hooks/pre-commit:
#!/bin/sh
echo "Running pre-commit checks..."
npm run lint
if [ $? -ne 0 ]; then
echo "Lint failed. Commit aborted."
exit 1
fiПосле этого:
chmod +x .git/hooks/pre-commitТеперь коммит не выполнится, если линтер вернёт ошибку.
Пример pre-push hook
#!/bin/sh
echo "Running tests before push..."
npm test
if [ $? -ne 0 ]; then
echo "Tests failed. Push aborted."
exit 1
fiТакой hook защитит репозиторий от попадания нерабочего кода.
Распространённые проблемы Git hooks
Несмотря на простоту, у hooks есть ограничения:
- они не версионируются вместе с кодом;
- зависят от окружения разработчика;
- могут замедлять работу при тяжёлых проверках.
Из-за этого в командах часто возникает ситуация, когда hooks у всех разные или отсутствуют.
Как делиться hooks в команде
Существует несколько подходов:
Хранение hooks в репозитории
Скрипты кладутся, например, в scripts/git-hooks/, а установка выполняется вручную или через Makefile.
Использование инструментов
Популярные решения:
- Husky — стандарт де-факто для JavaScript-проектов;
- pre-commit — универсальный Python-инструмент;
- lefthook — быстрый и кроссплатформенный менеджер hooks.
Они позволяют версионировать hooks и гарантировать единые правила для всей команды.
Лучшие практики
При использовании Git hooks стоит придерживаться правил:
- делайте проверки быстрыми;
- не запускайте тяжёлые тесты в
pre-commit; - используйте
pre-pushдля более дорогих операций; - всегда выводите понятные сообщения об ошибках.
Hooks должны помогать разработчику, а не мешать ему работать.
Практический кейс: автоматизация Git hooks с помощью Husky
В реальных проектах нативные Git hooks неудобны, потому что они не хранятся в репозитории и требуют ручной настройки у каждого разработчика. Для решения этой проблемы часто используют Husky — инструмент, который позволяет версионировать hooks вместе с кодом.
Рассмотрим пример для JavaScript / Node.js проекта.
Установка Husky
Сначала устанавливаем Husky как dev-зависимость:
npm install husky --save-devЗатем инициализируем hooks:
npx husky installОбычно эту команду добавляют в postinstall, чтобы hooks автоматически настраивались у всех разработчиков:
{
"scripts": {
"postinstall": "husky install"
}
}Pre-commit: запуск линтера
Добавим hook pre-commit, который запускает линтер перед коммитом:
npx husky add .husky/pre-commit "npm run lint"Теперь при попытке коммита:
- Husky запускает
npm run lint; - при ошибке коммит блокируется;
- разработчик сразу видит причину сбоя.
Pre-push: запуск тестов
Аналогично добавим проверку перед пушем:
npx husky add .husky/pre-push "npm test"Такой подход предотвращает отправку кода с падающими тестами в удалённый репозиторий.
Почему Husky удобен
Использование Husky даёт несколько преимуществ:
- hooks хранятся в репозитории;
- единые правила для всей команды;
- не требуется ручная настройка
.git/hooks; - кроссплатформенная работа (Linux, macOS, Windows).
Husky фактически превращает Git hooks в управляемую и предсказуемую часть процесса разработки.
Итоги
Git hooks — эффективный способ автоматизировать рутинные проверки прямо на стороне разработчика. Используя pre-commit и pre-push, можно значительно повысить качество кода и сократить количество ошибок, попадающих в репозиторий.
Инструменты вроде Husky делают эту автоматизацию удобной для командной разработки, позволяя хранить и поддерживать hooks наравне с остальным кодом проекта.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний