Git hooks. Ваш pre commit помощник

by dilix
Git hooks в помощь разработчику

Git hooks — инструмент, помогающий держать в порядке ваш репозиторий. Можно настроить автоматические правила оформления ваших коммитов. Это в свою очередь позволяет даже новым членам вашей команды соблюдать Code Style, принятый в вашем проекте.

Виды Git hooks

Ранее обсуждали работу с ветками в Git репозиториях, теперь же поговорим о том, как код попадает в общий репозиторий.

При инициализации Git репозитория вы можете найти .git папку, содержащую вспомогательные файлы для гита. Одна из вложенных папок .git/hooks содержит драфты возможных хуков, среди которых:

Название Git hooksНазначение хука
commit-msgХук вызывается перед коммитом. Он может изменять сообщение, а также использоваться, чтобы прервать выполнения коммита, если исходное сообщение не проходит вашу проверку. Хук можно обойти с помощью --no-verify
pre-pushХук выполняется перед пушем. Может быть использован чтобы прервать его.
pre-applypatchХук выполняется перед применением патчка. Может быть использован чтобы прервать его.
prepare-commit-msgХук выполняется перед коммитом, после подготовки сообщения по умолчанию. Основная цель - подготовить сообщение.
pre-commitХук в осноном используется для sanity check вашего кода перед отправкой на code review.
pre-rebaseХук вызывается перед ребейзом. Может быть использован, чтобы прервать его.
post-commitХук выполняется после завершения коммита. Служит главным образом для уведомлений и не может повлиять на ход коммита.

Таблица описывает не все, но самые используемые хуки. Полное описание с последовательностью вызовов можно найти в официальной документации.

Примеры Git hooks

Универсальных рецептов какие хуки нужны именно вам не существует, посмотрим какие сценарии можно покрыть с их помощью.


Дополнение commit message

Ветки и тэги в Git могут добавляться и удаляться. Неизменными остаются коммиты и сообщения к ним. Хорошей практикой является добавление вспомогательной информации в commit message. Например префиксом можно поставить номер задачи, которая решается в рамках коммита.

#!/bin/sh
#
# Automatically adds branch name and branch description to every commit message.
#
NAME=$(git branch | grep '*' | sed 's/*.*\///') 
DESCRIPTION=$(git config branch."$NAME".description)

echo "$NAME: $(cat $1)" > "$1"
if [ -n "$DESCRIPTION" ] 
then
   echo "" >> "$1"
   echo $DESCRIPTION >> "$1"
fi 
echo "" >> "$1"
echo "Jira issue" >> "$1"
echo "https://TASK_TRACKER_BASE_URL/browse/$NAME" >> "$1"

Данный пример к каждому коммиту добавляет ссылку на внутренний трекер задач и номер текущий ветки. Предположим текущая рабочая ветка feature/DIMLIX-1090, тогда commit message будем выглядеть так:

DIMLIX-1090: My custom commit message entered

Jira issue
https://TASK_TRACKER_BASE_URL/browse/DIMLIX-1090

Таким образом удобно просматривать историю изменений и прикрепленных решаемых задач.

История изменений в git commit

Проверка кода перед коммитом

Возможно, вы не хотите допускать код в ваш репозиторий, который не проходит базовые проверки. Можно создать pre-commit hook, который будет запускать внешнюю проверку и в зависимости от нее давать или нет делать коммит:

#!/bin/bash

git stash -q --keep-index

echo "Running git pre-commit hook"

./gradlew ktlint

RESULT=$?

git stash pop -q

# return 1 exit code if running checks fails
[ $RESULT -ne 0 ] && exit 1
exit 0

Применение хукам ограничено только лишь вашим воображением. Теперь, когда код успешно заливается в ваш репозиторий, самое время поговорить про continuous integration, continuous delivery и удобном деплое ваших приложений.

Хочешь обсудить Android разработку?
Заходи к нам Вконтакте, на Facebook и в Телеграм!

Добавить комментарий

Может быть интересно

Этот сайт использует Cookie файлы для улучшения вашего пользовательского взаимодействия. Используя данный сайт вы соглашается с этим. Принять Читать

Политика конфиденциальности и Cookies