Как настроить Git hooks для автоматизации перед коммитом и пушем

7 минут чтения
Средний рейтинг статьи — 4.7

Git hooks — это простой, но мощный механизм автоматизации, встроенный прямо в Git. Они позволяют запускать произвольные скрипты на разных этапах работы с репозиторием: перед коммитом, перед пушем, после слияния и т.д. С их помощью можно автоматически проверять код, форматировать файлы, запускать тесты и предотвращать попадание ошибок в репозиторий.

В этой статье разберёмся, как работают Git hooks, какие из них используются чаще всего и как настроить автоматизацию перед commit и push.

Что такое Git hooks

Git hooks — это исполняемые скрипты, которые Git вызывает при наступлении определённых событий. Они хранятся в каталоге:

.git/hooks/

По умолчанию там лежат файлы с расширением .sample. Чтобы hook начал работать, нужно:

  • убрать расширение .sample;
  • сделать файл исполняемым.

Hooks выполняются локально и не попадают в репозиторий, что важно учитывать при работе в команде.

Когда используются Git hooks

На практике hooks применяются для:

  • проверки стиля кода;
  • запуска линтеров;
  • выполнения тестов;
  • валидации commit message;
  • предотвращения push’а при ошибках.

Это позволяет ловить проблемы максимально рано — ещё до попадания кода в общий репозиторий.

Основные hooks для автоматизации

pre-commit

Срабатывает перед созданием коммита. Если hook завершится с ненулевым кодом, коммит будет отменён.

Типичные задачи:

  • запуск линтера;
  • форматирование кода;
  • проверка конфигураций.

commit-msg

Вызывается после ввода сообщения коммита. Используется для проверки его формата (например, Conventional Commits).

pre-push

Срабатывает перед отправкой изменений в удалённый репозиторий. Часто используется для:

  • запуска тестов;
  • проверки сборки проекта;
  • блокировки push’а в main без условий.

Пример простого pre-commit hook

Создадим файл .git/hooks/pre-commit:

#!/bin/sh
 
echo "Running pre-commit checks..."
 
npm run lint
if [ $? -ne 0 ]; then
  echo "Lint failed. Commit aborted."
  exit 1
fi

После этого:

chmod +x .git/hooks/pre-commit

Теперь коммит не выполнится, если линтер вернёт ошибку.

Пример pre-push hook

#!/bin/sh
 
echo "Running tests before push..."
 
npm test
if [ $? -ne 0 ]; then
  echo "Tests failed. Push aborted."
  exit 1
fi

Такой hook защитит репозиторий от попадания нерабочего кода.

Распространённые проблемы Git hooks

Несмотря на простоту, у hooks есть ограничения:

  • они не версионируются вместе с кодом;
  • зависят от окружения разработчика;
  • могут замедлять работу при тяжёлых проверках.

Из-за этого в командах часто возникает ситуация, когда hooks у всех разные или отсутствуют.

Как делиться hooks в команде

Существует несколько подходов:

Хранение hooks в репозитории

Скрипты кладутся, например, в scripts/git-hooks/, а установка выполняется вручную или через Makefile.

Использование инструментов

Популярные решения:

  • Husky — стандарт де-факто для JavaScript-проектов;
  • pre-commit — универсальный Python-инструмент;
  • lefthook — быстрый и кроссплатформенный менеджер hooks.

Они позволяют версионировать hooks и гарантировать единые правила для всей команды.

Лучшие практики

При использовании Git hooks стоит придерживаться правил:

  • делайте проверки быстрыми;
  • не запускайте тяжёлые тесты в pre-commit;
  • используйте pre-push для более дорогих операций;
  • всегда выводите понятные сообщения об ошибках.

Hooks должны помогать разработчику, а не мешать ему работать.

Практический кейс: автоматизация Git hooks с помощью Husky

В реальных проектах нативные Git hooks неудобны, потому что они не хранятся в репозитории и требуют ручной настройки у каждого разработчика. Для решения этой проблемы часто используют Husky — инструмент, который позволяет версионировать hooks вместе с кодом.

Рассмотрим пример для JavaScript / Node.js проекта.

Установка Husky

Сначала устанавливаем Husky как dev-зависимость:

npm install husky --save-dev

Затем инициализируем hooks:

npx husky install

Обычно эту команду добавляют в postinstall, чтобы hooks автоматически настраивались у всех разработчиков:

{
  "scripts": {
    "postinstall": "husky install"
  }
}

Pre-commit: запуск линтера

Добавим hook pre-commit, который запускает линтер перед коммитом:

npx husky add .husky/pre-commit "npm run lint"

Теперь при попытке коммита:

  • Husky запускает npm run lint;
  • при ошибке коммит блокируется;
  • разработчик сразу видит причину сбоя.

Pre-push: запуск тестов

Аналогично добавим проверку перед пушем:

npx husky add .husky/pre-push "npm test"

Такой подход предотвращает отправку кода с падающими тестами в удалённый репозиторий.

Почему Husky удобен

Использование Husky даёт несколько преимуществ:

  • hooks хранятся в репозитории;
  • единые правила для всей команды;
  • не требуется ручная настройка .git/hooks;
  • кроссплатформенная работа (Linux, macOS, Windows).

Husky фактически превращает Git hooks в управляемую и предсказуемую часть процесса разработки.

Итоги

Git hooks — эффективный способ автоматизировать рутинные проверки прямо на стороне разработчика. Используя pre-commit и pre-push, можно значительно повысить качество кода и сократить количество ошибок, попадающих в репозиторий.

Инструменты вроде Husky делают эту автоматизацию удобной для командной разработки, позволяя хранить и поддерживать hooks наравне с остальным кодом проекта.

7 минут чтения
Средний рейтинг статьи — 4.7

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний