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.