Как работает механизм хука в Git?

Git Hooks - это скрипты, которые автоматически запускаются Git'ом до или после определенных событий, таких как commit, push и receive.

Они находятся в каталоге .git/hooks/ в репозитории.

Принцип работы:

  • При возникновении события Git ищет исполняемый файл с соответствующим именем хука.
  • Если файл найден и исполняемый, он выполняется.
  • Хуки могут использоваться для проверки commit-сообщений, форматирования кода, запуска тестов и других задач, обеспечивая автоматизацию и соблюдение стандартов разработки.
  • Хуки могут быть client-side (локальные для разработчика) или server-side (на сервере репозитория).

Пример: pre-commit хук может проверять commit-сообщение на соответствие заданному шаблону.


Хуки в Git - это мощный механизм, позволяющий выполнять пользовательские скрипты автоматически в определенных точках жизненного цикла Git. Они представляют собой скрипты, расположенные в каталоге .git/hooks вашего Git-репозитория. Когда Git достигает определенной точки (например, перед коммитом, после получения изменений и т.д.), он проверяет, есть ли в этом каталоге соответствующий скрипт и, если да, выполняет его.

Как это работает:

  1. Каталог .git/hooks: В каждом репозитории Git есть каталог .git/hooks. Внутри этого каталога находятся примеры скриптов хуков (с расширением .sample). Чтобы активировать хук, нужно удалить расширение .sample и сделать скрипт исполняемым.
  2. События, вызывающие хуки: Git предоставляет набор событий, которые могут вызывать выполнение хуков. Примеры:
    • pre-commit: Выполняется перед созданием коммита. Используется для проверки форматирования кода, запуска тестов и т.д. Если этот хук завершается с ненулевым кодом возврата, коммит будет отменен.
    • prepare-commit-msg: Выполняется перед открытием редактора сообщения коммита. Позволяет динамически изменять сообщение коммита.
    • commit-msg: Выполняется после того, как пользователь ввел сообщение коммита, но до фактического создания коммита. Используется для проверки соответствия сообщения коммита определенным стандартам. Если этот хук завершается с ненулевым кодом возврата, коммит будет отменен.
    • post-commit: Выполняется после создания коммита. Используется для уведомлений, запуска сборки и т.д.
    • pre-push: Выполняется перед отправкой (push) коммитов на удаленный репозиторий. Используется для проверки того, что отправляемые коммиты соответствуют определенным требованиям (например, все тесты проходят). Если этот хук завершается с ненулевым кодом возврата, отправка будет отменена.
    • post-receive: Выполняется на удаленном репозитории после получения изменений. Используется для запуска сборки, развертывания и т.д.
    • update: Выполняется на удаленном репозитории перед обновлением веток.
  3. Написание скриптов хуков: Скрипты хуков могут быть написаны на любом языке сценариев (например, Bash, Python, Perl). Git передает скрипту хука информацию об инициировавшем событии (например, имена затронутых веток, сообщение коммита). Скрипт может использовать эту информацию для выполнения определенных действий.
  4. Код возврата: Важно, чтобы скрипт хука возвращал определенный код возврата. Код 0 означает успешное выполнение, а любой другой код означает ошибку. В случае ошибки Git может отменить операцию (например, коммит, отправку).
  5. Локальные и глобальные хуки: Хуки в каталоге .git/hooks применяются только к конкретному репозиторию. Также можно настроить глобальные хуки, которые будут применяться ко всем репозиториям на машине. Это делается с помощью настройки core.hooksPath в конфигурации Git. При наличии локального и глобального хука для одного и того же события, будет выполнен только локальный хук.

Пример (pre-commit):

#!/bin/bash

# Проверка наличия ошибок линтинга в файлах, добавленных в коммит
eslint .

if [ $? -ne 0 ]; then
  echo "Обнаружены ошибки линтинга.  Пожалуйста, исправьте их перед коммитом."
  exit 1
fi

# Запуск модульных тестов
npm test

if [ $? -ne 0 ]; then
    echo "Модульные тесты не пройдены.  Пожалуйста, исправьте ошибки перед коммитом."
    exit 1
fi

exit 0

Важно: Хуки не распространяются вместе с репозиторием при клонировании. Это означает, что каждый разработчик должен настроить свои собственные хуки. Чтобы сделать хуки более доступными, можно хранить скрипты хуков в репозитории и предоставить скрипт установки, который скопирует их в каталог .git/hooks.

0