Pull to refresh

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

Reading time 2 min
Views 36K
Для того чтобы познакомиться с механизмом хуков в 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.
Tags:
Hubs:
+29
Comments 15
Comments Comments 15

Articles