Пример использования хуков (hooks) в 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.