Git·19 питань

Як налаштувати git hooks для автоматизації?

Відповідь

Git hooks — скрипти, які запускаються автоматично при певних подіях Git. Вони допомагають автоматизувати перевірки коду, форматування та тести.

Де зберігаються hooks: у кожному репозиторії є папка .git/hooks з прикладами hooks з розширенням .sample. Щоб активувати hook, видаліть розширення .sample і зробіть файл виконуваним: chmod +x .git/hooks/pre-commit. Hooks не версіонуються — вони локальні для кожного розробника. Для спільних hooks використовуйте Husky або подібні інструменти.

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.

Чи корисна ця відповідь?

Інші питання цієї теми

Пов’язані питання з інших тем