Git hooks и pre-commit: автоматические проверки перед коммитом
Коротко: Git hooks запускают скрипты при определённых событиях, например перед коммитом; так форматирование, линтинг, тесты и сканирование секретов можно обеспечивать автоматически.
Подробнее: Раннее обнаружение ошибок экономит время. Git hooks — это скрипты в папке .git/hooks/, которые Git запускает при событиях: pre-commit, commit-msg, pre-push, post-merge и других. Если хук возвращает код ошибки, Git прерывает действие.
Подробности
Пример: собственный хук
#!/bin/sh
npm run lint --silent || {
echo "Ошибки линтера: коммит прерван"; exit 1;
}Проблема: .git/hooks не версионируется и не передаётся команде. Лучше: управлять хуками с помощью инструмента, который устанавливает их из репозитория.
Инструменты
- pre-commit (на Python, независим от языка): конфигурация в
.pre-commit-config.yaml, установкаpre-commit install; хуки для Black, Ruff, Prettier, ESLint, shellcheck, gitleaks, пробелов в конце строк и многого другого. - Husky + lint-staged (JavaScript): проверяет только изменённые файлы.
- Lefthook (быстрый, Go).
- В конфигурации Git:
git config core.hooksPath .githooks, если папка лежит в репозитории.
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.5.0
hooks: [{id: ruff}, {id: ruff-format}]
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.0
hooks: [{id: gitleaks}]Что стоит проверять
- Форматирование и линтинг (держите быстрыми, чтобы никто не обходил хуки).
- Секреты (gitleaks) и большие файлы.
- Сообщения коммитов (commit-msg, Conventional Commits).
- Быстрые тесты перед push (
pre-push). - Никаких маркеров конфликтов слияния, никаких
console.log/debugger.
Медленные проверки (полный набор тестов) относятся к CI.
Ограничения
Хуки локальны и обходимы (git commit --no-verify), поэтому они не заменяют CI и серверные правила (защита веток, обязательные проверки, обязательные ревью). Это удобство, делающее ошибки видимыми на раннем этапе. Держите их быстрыми (не более нескольких секунд), документируйте настройку в README и проверяйте заново в CI.
См. также: Конвейер CI/CD, Conventional Commits, Управление секретами