Disallow hg push -f - но разрешить hg pull создать новую голову
В качестве продолжения для Mercurial: примените "hg pull -u" перед "hg commit", я начал использовать ловушку
[hooks]
pretxnchangegroup.forbid_2heads = /usr/local/bin/forbid_2head.sh
где forbid_2head.sh выглядит так
#!/bin/bash
BRANCH=`hg branch`
COUNT=`hg heads --template '{branch}|{rev}\n' | grep ^${BRANCH} | wc -l`
if [ "$COUNT" -ne "1" ] ; then
echo "=========================================================="
echo "Trying to push more than one head, which is not allowed"
echo "You seem to try to add changes to an old changeset!"
echo "=========================================================="
exit 1
fi
exit 0
Он является производным от скрипта, который можно найти по адресу http://tutorials.davidherron.com/2008/10/forbidding-multiple-heads-in-shared.html где я допускаю несколько именованных ветвей.
У меня сейчас проблема в том, что
- это останавливает hg push -f, что я и хотел
- он также останавливает hg pull в случае, если есть входящие изменения и у меня есть исходящие. Это действительно плохо
Могу ли я каким-либо образом повторно использовать тот же скрипт, но изменить настройку ловушки и остановить "hg push -f"? Или я могу в hibid_2head.sh знать, выполняется ли команда push или pull?
1 ответ
Во-первых, скрипт не совсем корректен: он просто подсчитывает количество головок в филиале, которые в данный момент извлечены на сервере (тот, который hg branch
) отчеты. Вы можете улучшить его, используя
hg heads tip
чтобы получить руководители филиала tip
, Но кто-то может вставлять наборы изменений в более чем одну ветку за раз, так что вы действительно хотите
hg heads --template '{branch}\n' $HG_NODE:tip
найти головки веток для веток, которых коснулся $HG_NODE:tip
(наборы изменений помещены в еще не подтвержденную транзакцию). Затем вы можете сравнить это с
hg log --template '{branch}\n' -r $HG_NODE:tip | sort -u
которые являются ветвями, которых коснулась группа изменений.
Если вы не хотите разрешать использование нескольких головок, вы можете упростить приведенное выше
$(hg heads --template 'x' | wc -c) -eq $(hg branches | wc -l)
который просто проверяет, что количество заголовков ветвей равно количеству ветвей, т. е. что на каждую названную ветвь приходится ровно один заголовок ветви.
С этим из пути, позвольте мне упомянуть $HG_SOURCE
, Эта переменная окружения устанавливается Mercurial при запуске ловушки: она имеет значение push
если группа изменений вставляется в хранилище с использованием прямого доступа к файловой системе, и значение serve
если группа изменений приходит через SSH или HTTP. Смотрите книгу Меркурий.
Итак, в заключение, я считаю, что это хороший сценарий "Запретить несколько голов":
#!/bin/sh
HEADS=$(hg heads --template 'x' | wc -c)
BRANCHES=$(hg branches | wc -l)
test $HG_SOURCE = 'serve' -a $HEADS -ne $BRANCHES