Использование хука обновления
Вы знаете о хуках - пожалуйста, прочтите документация о них! Хук, который вам, вероятно, нужен, это update, который запускается один раз для каждой ссылки. (Хук pre-receive запускается один раз для всего нажатия) На SO уже есть множество вопросов и ответов об этих хуках; в зависимости от того, что вы хотите сделать, вы, вероятно, можете найти руководство о том, как написать хук, если вам это нужно.
Чтобы подчеркнуть, что это действительно возможно, цитата из документации:
Этот хук можно использовать для предотвращения принудительного обновления определенных ссылок, убедившись, что имя объекта является объектом фиксации, который является потомком объекта фиксации, названного старым именем объекта. То есть, чтобы применить политику только быстрой перемотки вперед.
Его также можно использовать для регистрации старого.. нового статуса.
И конкретика:
Хук выполняется один раз для каждой обновляемой ссылки и принимает три параметра:
- имя обновляемой ссылки,
- старое имя объекта, хранящееся в ссылке,
- и новое имя объекта, которое будет сохранено в ref.
Так, например, если вы хотите убедиться, что ни одна из тем фиксации не длиннее 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/experimental обновляется:
o - o - o (origin/master) - o - X - o - o (master)
\
o - o - o - o (origin/experimental, experimental)
Хук pre-receive запускается только один раз, непосредственно перед началом обновления ссылок (до первого запуска хука обновления). Если бы вы использовали его, вам пришлось бы вызвать сбой всей отправки, тем самым говоря, что, поскольку на мастере было плохое сообщение о коммите, вы почему-то больше не верите, что коммиты на экспериментальном сервере хорошие, даже если их сообщения в порядке!
person
Cascabel
schedule
26.03.2010