EMZETT.
Войти

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, Управление секретами