Использование обновления крюка
Вы знаете о крючках - пожалуйста, прочитайте документацию о них! Хук, который вы, вероятно, хотите, это обновление, которое запускается один раз для ссылки (Предварительно получаемый хук запускается один раз за весь пуш). Есть множество вопросов и ответов об этих хуках уже на SO; в зависимости от того, что вы хотите сделать, вы, возможно, найдете руководство о том, как написать хук, если вам это нужно.
Чтобы подчеркнуть, что это действительно возможно, приведем цитату из документа:
Этот хук можно использовать для предотвращения принудительного обновления некоторых ссылок, убедившись, что имя объекта является объектом фиксации, который является потомком объекта фиксации, названного старым именем объекта. То есть для применения политики «только перемотка вперед».
Он также может быть использован для регистрации старого .. нового статуса.
А конкретика:
Хук выполняется один раз для каждого обновления, которое будет обновлено, и принимает три параметра:
- имя обновляемой ссылки,
- старое имя объекта, сохраненное в ссылке,
- и новое имя объекта, которое будет сохранено в ссылке.
Так, например, если вы хотите убедиться, что ни одна из тем фиксации не длиннее 80 символов, очень элементарной реализацией будет:
#!/bin/bash
long_subject=$(git log --pretty=%s $2..$3 | egrep -m 1 '.{81}')
if [ -n "$long_subject" ]; then
echo "error: commit subject over 80 characters:"
echo " $long_subject"
exit 1
fi
Конечно, это игрушечный пример; в общем случае вы должны использовать вывод журнала, содержащий полное сообщение о фиксации, разделять его на каждую фиксацию и вызывать код подтверждения для каждого отдельного сообщения о фиксации.
Зачем вам нужен крюк для обновления
Это обсуждалось / уточнялось в комментариях; вот краткое изложение.
Хук обновления запускается один раз за ссылку. Ссылка - это указатель на объект; в данном случае мы говорим о ветвях и тегах, и, как правило, просто о ветвлениях (люди не часто нажимают на теги, поскольку они обычно используются только для маркировки версий).
Теперь, если пользователь загружает обновления для двух ветвей - основной и экспериментальной:
o - o - o (origin/master) - o - X - o - o (master)
\
o - o (origin/experimental) - o - o (experimental)
Предположим, что X - это "плохой" коммит, т. Е. Тот, который не прошел бы ловушку commit-msg. Ясно, что мы не хотим принимать толчок к мастеру. Таким образом, хук обновления отвергает это. Но нет ничего плохого в коммитах на экспериментальных! Хук обновления принимает это. Следовательно, origin / master остается неизменным, но origin / экспериментальный обновляется:
o - o - o (origin/master) - o - X - o - o (master)
\
o - o - o - o (origin/experimental, experimental)
Хук предварительного получения запускается только один раз, непосредственно перед началом обновления ссылок (до первого запуска хука обновления). Если бы вы использовали его, вам бы пришлось заставить весь толчок потерпеть неудачу, сказав, что из-за плохого сообщения о коммите на мастере вы почему-то больше не верите, что коммиты на эксперименте хороши, даже если их сообщения в порядке! 1046 *