Gymterview
junior

Что такое git hooks?

Git hooks — это скрипты, которые автоматически запускаются при определённых событиях Git (коммит, пуш, merge и т.д.) и позволяют автоматизировать проверки и обеспечивать соблюдение правил разработки.

Client-side хуки (на стороне разработчика)

Хранятся в .git/hooks/ каждого репозитория.

Хук Когда срабатывает Типичное использование
pre-commit Перед созданием коммита Линтинг, форматирование, проверка секретов
prepare-commit-msg После создания сообщения по умолчанию Автоматическое добавление номера задачи
commit-msg После ввода commit message Валидация формата сообщения (Conventional Commits)
pre-push Перед отправкой на сервер Запуск тестов, проверка качества кода
post-commit После успешного коммита Уведомления
post-merge После merge Установка зависимостей

Server-side хуки (на стороне сервера)

Хук Когда срабатывает Типичное использование
pre-receive При получении push Проверка прав, валидация коммитов
update При обновлении каждой ветки Проверка политик для конкретной ветки
post-receive После получения push Деплой, уведомления, CI-триггеры

Примеры

pre-commit: проверка стиля кода
#!/bin/bash
# .git/hooks/pre-commit

# Запустить checkstyle перед коммитом
cd examples && mvn checkstyle:check
if [ $? -ne 0 ]; then
    echo "Checkstyle failed. Fix issues before committing."
    exit 1
fi
commit-msg: валидация формата
#!/bin/bash
# .git/hooks/commit-msg

COMMIT_MSG_FILE=$1
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")

# Проверка Conventional Commits формата
PATTERN="^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .{1,72}"
if ! echo "$COMMIT_MSG" | grep -qE "$PATTERN"; then
    echo "Commit message must follow Conventional Commits format:"
    echo "   type(scope): description"
    echo "   Examples: feat(auth): add JWT validation"
    echo "             fix: correct null pointer in UserService"
    exit 1
fi
pre-push: запуск тестов
#!/bin/bash
# .git/hooks/pre-push

echo "Running tests before push..."
cd examples && mvn test
if [ $? -ne 0 ]; then
    echo "Tests failed. Push aborted."
    exit 1
fi

Установка хуков

Пример
# Хуки находятся в .git/hooks/
# Сделать хук исполняемым
chmod +x .git/hooks/pre-commit

# Для шаринга хуков в команде — хранить в директории проекта
mkdir -p .githooks
# и настроить Git:
git config core.hooksPath .githooks

Ключевые моменты

  • Хуки из .git/hooks/ не коммитятся — они локальны для каждого клона
  • Для шаринга хуков используйте отдельную директорию (.githooks/) и git config core.hooksPath
  • Хук должен вернуть exit code 0 для успеха и ненулевой для блокировки операции
  • Client-side хуки можно обойти через --no-verify — server-side хуки обойти нельзя

Частые ошибки

  • Забывать делать хуки исполняемыми (chmod +x)
  • Создавать слишком медленные pre-commit хуки — раздражает разработчиков
  • Полагаться только на client-side хуки для критичных проверок — их можно обойти
  • Хранить хуки только в .git/hooks/ — они теряются при клонировании

Как используется в 2026

  • Инструменты Husky (JS), pre-commit (Python) и lefthook (Go) автоматизируют установку и управление хуками
  • Хуки используются для Conventional Commits validation, автоформатирования, проверки секретов
  • Server-side хуки заменяются CI/CD pipelines и branch protection rules в GitHub/GitLab
  • Хуки интегрированы в pipelines: при неуспехе pre-commit в CI блокируется merge PR

На собеседовании: разделите хуки на client-side (pre-commit, commit-msg, pre-push) и server-side (pre-receive, post-receive). Ключевое: client-side можно обойти через --no-verify, server-side — нельзя. Покажите знание инструментов: Husky, lefthook, pre-commit. Частый вопрос: как шарить хуки в команде — ответ: .githooks/ + core.hooksPath.