Git Hooks - это скрипты, которые автоматически запускаются Git'ом до или после определенных событий, таких как commit, push и receive.
Они находятся в каталоге .git/hooks/
в репозитории.
Принцип работы:
Пример: pre-commit
хук может проверять commit-сообщение на соответствие заданному шаблону.
Хуки в Git - это мощный механизм, позволяющий выполнять пользовательские скрипты автоматически в определенных точках жизненного цикла Git. Они представляют собой скрипты, расположенные в каталоге .git/hooks
вашего Git-репозитория. Когда Git достигает определенной точки (например, перед коммитом, после получения изменений и т.д.), он проверяет, есть ли в этом каталоге соответствующий скрипт и, если да, выполняет его.
Как это работает:
.git/hooks
: В каждом репозитории Git есть каталог .git/hooks
. Внутри этого каталога находятся примеры скриптов хуков (с расширением .sample
). Чтобы активировать хук, нужно удалить расширение .sample
и сделать скрипт исполняемым.
pre-commit
: Выполняется перед созданием коммита. Используется для проверки форматирования кода, запуска тестов и т.д. Если этот хук завершается с ненулевым кодом возврата, коммит будет отменен.prepare-commit-msg
: Выполняется перед открытием редактора сообщения коммита. Позволяет динамически изменять сообщение коммита.commit-msg
: Выполняется после того, как пользователь ввел сообщение коммита, но до фактического создания коммита. Используется для проверки соответствия сообщения коммита определенным стандартам. Если этот хук завершается с ненулевым кодом возврата, коммит будет отменен.post-commit
: Выполняется после создания коммита. Используется для уведомлений, запуска сборки и т.д.pre-push
: Выполняется перед отправкой (push) коммитов на удаленный репозиторий. Используется для проверки того, что отправляемые коммиты соответствуют определенным требованиям (например, все тесты проходят). Если этот хук завершается с ненулевым кодом возврата, отправка будет отменена.post-receive
: Выполняется на удаленном репозитории после получения изменений. Используется для запуска сборки, развертывания и т.д.update
: Выполняется на удаленном репозитории перед обновлением веток..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
.