Пример использования хуков (hooks) в git

Git*
Для того чтобы познакомиться с механизмом хуков в git, достаточно просто начать их использовать и посмотреть как оно работает, и как оно устроено внутри.
Хуки в git это некие скрипты, срабатывающие на определенные события, по сути своей являются их обработчиками. Расположены они в каталоге .git/hooks.


Для примера попробуем сделать простенький обработчик. Его задача поместить в редактируемое описание к коммиту нужную нам информацию.

Итак создадим в каталоге .git/hooks нашего проекта скрипт prepare-commit-msg со следующим содержимым:

#!/bin/sh

#получаем последний коммит в master от которого отпочковался наш бранч
last_master=`git log origin/master| head -n 1|cut -f 2 -d ' '`;
#получаем текущий коммит
parent=`git log | head -n 1|cut -f 2 -d ' '`;
#выделяем из имени бранча номер тикета. Бранч всегда называется по шаблону Номер_Краткое_Описание
#например 1364_restore_xterm_title
ticket=`git branch|grep '* '|cut -f 1 -d '_'|cut -f 2 -d ' '`;

#если это первый коммит в бранче то вначале описания к коммиту добавляем Ticket #Номер
if [ "$last_master" == "$parent" ]; then
echo "Ticket #$ticket" > "$1".tmp;
fi

# берем из переменной GIT_AUTHOR_IDENT имя текущего коммитера
SOB=$(git var GIT_AUTHOR_IDENT | sed -n "s/^\(.*>\).*$/Signed-off-by: \1/p")
grep -qs "^$SOB""$1"|| echo "$SOB" >> "$1".tmp;

#выделяем из вывода команды diff только строки содержащие "+++", "---", "@@"
(echo; git diff --cached| grep -e "+++" -e "---" -e "@@"|sed -e 's/.*/# &/')>> "$1".tmp;
#убираем пустые строки
(echo; sed -e '/^$/d' "$1") >> "$1".tmp
mv "$1".tmp "$1";



Скрипт вставляет подпись коммитера и добавляет список измененных функций данным коммитом. Кроме того, так как у нас в проекте строго регламентированный рабочий процесс, согласно которому оформление коммитов должно производиться определенным образом, то для своего удобства я добавил вставку номера тикета в начало описания коммита, но только если это первый коммит в бранче.

Этот хук работает на стороне клиента и как видно из названия, срабатывает он в момент вызова git commit.
+29
12 ноября 2009, 16:51
50
smind 103,5

комментарии (13)

0
bio #
Еще с помощью хуков удобно автоматом убирать пробелы в конце строк кода (старый нюанс описан недавно на Codinghorror).
+5
BekoBou #
Говорят комментарии в коде рулят и бибикают… Пожалуйста добавьте их.
0
smind #
добавил комментариев.
там просто кода совсем ничего и он весьма простенький.
+3
sapun #
я с помощью хуков при пуше в репо рассылаю девелоперам информацию о комитах и дифф
0
krak #
А можете показать Ваш хук?
И где можно взять больше примеров?
0
sapun #
как выдастся свободная минутка напишу инсталлер для хука, запушу на гитхаб и топик сделаю
0
smind #
Позже выложу пример серверного хука срабатывающего на update.
0
freemandigger #
Мне понравился вот такой хук на эту тему: Git hook script example on SF.
0
preprocessor #
Хуки по большому счету зло, веб-хуки куда православнее.
0
VlK #
А что есть веб-хуки?
0
Ntropy #
Напрашивается мелкая оптимизация:
git log origin/master --max-count=1 -pretty=%H
вместо
git log origin/master | head -n 1|cut -f 2 -d ' ';
0
smind #
всегда за, спасибо
0
artzub #
У меня почему-то выдает сообщение об ошибке:
error: cannot spawn .git/hooks/prepare-commit-msg: No such file or directory
если что то ОС WinXP

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.