Как настроить git hooks для автоматизации?
Git hooks — скрипты, которые запускаются автоматически при определённых событиях Git. Они помогают автоматизировать проверки кода, форматирование и тесты.
Где хранятся hooks: в каждом репозитории есть папка .git/hooks с примерами hooks с расширением .sample. Чтобы активировать hook, удалите расширение .sample и сделайте файл исполняемым: chmod +x .git/hooks/pre-commit. Hooks не версонируются — они локальные для каждого разработчика. Для общих hooks используйте Husky или similar инструменты.
Client-side hooks: pre-commit запускается перед коммитом. Если возвращает ненулевой код — коммит отменяется. Используйте для линтинга, форматирования, проверки секретов. prepare-commit-msg — перед открытием редактора сообщения, можно генерировать шаблон. pre-push — перед push, можно запускать тесты.
Server-side hooks: pre-receive, update, post-receive — на сервере (GitHub, GitLab). Используются для проверки прав, отклонения push при нарушении правил. На GitHub настраиваются через GitHub Actions или Branch Protection Rules.
Husky — популярный инструмент для общих client-side hooks. Установка: npm install --save-dev husky, npx husky init. Это создаёт папку .husky/ с hooks, которые версонируются в репозитории. Все разработчики получают одинаковые hooks автоматически. Пример .husky/pre-commit: npx lint-staged — запускает линтер только для staged-файлов.
lint-staged — companion для Husky. Конфигурация в package.json: "lint-staged": {"*.js": "eslint --fix", "*.ts": "tsc --noEmit", "*.css": "prettier --write"}. Запускает инструменты только для файлов в индексе, а не для всего проекта — быстро.
pre-commit framework — альтернатива Husky, мультиязычная. Установка: pip install pre-commit, pre-commit install. Конфигурация в .pre-commit-config.yaml. Поддерживает hooks на Python, Node, Go, Rust. Имеет встроенные hooks: trailing-whitespace, end-of-file-fixer, check-yaml.
Практический pre-commit hook: проверка отсутствия console.log, проверка форматирования, проверка секретов (git-secrets, trufflehog), запуск unit-тестов для затронутых файлов. Если hook падает — коммит отменяется, разработчик видит ошибки и исправляет.
Совет: не делайте hooks слишком медленными. pre-commit должен выполняться за секунды, иначе разработчики будут его обходить (--no-verify). Тяжёлые проверки (интеграционные тесты, полный анализ) — в CI/CD, не в hooks.