Автоматизация рутинных задач — ключ к развитию и стабильности в любом инженерном процессе. Git Hooks позволяют встроить нужные проверки и действия прямо в жизненный цикл работы с репозиторием: от простого форматирования кода до автоматического запуска тестов перед каждым коммитом. В этой статье вы найдёте краткую теорию, список популярных сценариев применения и пошаговую инструкцию по настройке своих хук-сценариев. Весь разбор — на реальных примерах для современных команд.
Что такое Git Hooks и зачем они нужны?
Git Hooks — это встроенный механизм Git, который позволяет автоматически запускать произвольные скрипты на определённых этапах работы с репозиторием (например, перед коммитом, пушем или мёрджем). Основное предназначение — автоматизация и контроль качества кода, сокращение количества ошибочных коммитов, экономия времени всей команды.
Где используются?
- Pre-commit (до коммита): запуск линтеров, автоформаттеров или unit-тестов.
- Pre-push (до отправки в удалённый репозиторий): прогон всех тестов, проверка соответствия ветки политике репозитория.
- Commit-msg: валидация сообщения коммита по определённым правилам.
Использование Git Hooks значительно упрощает соблюдение стандартов кодирования и предотвращает попадание "грязных" коммитов в репозиторий.
Практические сценарии применения Git Hooks
Применить хуки можно в разнообразных задачах. Рассмотрим несколько самых востребованных сценариев.
1. Автоматическая проверка качества кода (линтеры)
- Перед каждым коммитом запускается линтер (например,
flake8для Python илиeslintдля JS). - В случае ошибок коммит блокируется до их исправления.
#!/bin/sh
# .git/hooks/pre-commit
eslint .
if [ $? -ne 0 ]; then
echo "\nИспользуйте eslint: найдены ошибки!"
exit 1
fi
2. Автоформатирование кода
- Запуск
prettierилиblackперед сохранением изменений. - Машинное форматирование обеспечивает единый стиль команды.
#!/bin/sh
black .
3. Запуск unit-тестов перед пушем
- Все тесты должны пройти успешно до отправки на сервер.
- Ошибочный пуш предотвращается автоматически.
#!/bin/sh
pytest
if [ $? -ne 0 ]; then
echo "\nЕсть тесты с ошибками. Пуш запрещён."
exit 1
fi
4. Проверка шаблона сообщений коммита (commit-msg)
- Требование к формату сообщения (например, task ID в начале):
#!/bin/sh
MESSAGE=$(cat $1)
if ! echo "$MESSAGE" | grep -qE "^TASK-\\d+"; then
echo "\nСообщение коммита должно начинаться с TASK-<номер>"
exit 1
fi
Пошаговая настройка Git Hooks
Гит хранит хуки в папке .git/hooks/ каждого репозитория. Они представлены в виде bash-скриптов (или других совместимых форматов). Разберём процесс на примере pre-commit хука.
Шаг 1. Создаём или редактируем файл хука
- Перейдите в проект:
- Откройте папку
.git/hooks/. - Создайте файл
pre-commit(или переименуйтеpre-commit.sample): - Добавьте нужный скрипт (см. примеры выше).
cd /path/to/your/project
touch .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
Шаг 2. Проверяем работу
- Внесите изменения в код.
- Попробуйте сделать коммит:
- Если скрипт возвращает ошибку (
exit 1), коммит не произойдёт.
git add .
git commit -m "test: commit with hook"
Шаг 3. Хранение и распространение хуков в команде
Нативные хуки не попадают в индекс гита. Чтобы не заставлять всех участников создавать хуки вручную, используют утилиты — менеджеры хуков:
pre-commit(https://pre-commit.com/) — кросc-языковое решение, удобно интегрируется во все популярные языки.husky(экосистема JavaScript) — быстрая настройка хуков и распределение их через репозиторий.
Такие инструменты позволяют хранить конфигурацию хуков в репозитории и автоматически устанавливать их при клонировании, что критично для командной работы.
Заключение: стоит ли внедрять Git Hooks?
Git Hooks — незаменимый инструмент современного разработчика. Даже пара простых хуков (линтер, тесты, форматтер) сразу поднимают качество и экономят время вашего проекта. Главное — поддерживать сценарии актуальными и делиться ими с командой через специализированные инструменты (pre-commit, husky). Начните с малого — автоматизации проверки кода перед коммитом, постепенно добавляя новые полезные сценарии.
Внедряйте хуки — и пусть рутинная проверка кода займет секунды, а не часы!