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, Керування секретами