2014-01-24 2 views
1

Как noted in the documentation, команда hg backout может вызвать проблемы при использовании с наборами слияний. Недавно у нас было несколько случаев, когда новые разработчики поддерживали смену наборов изменений и вызывали код, который мы хотели сохранить, чтобы вернуться, когда все объединяется.Меркурийное удлинение или крючок для предотвращения повторного набора изменений слияния

Чтобы избежать этого, я пытаюсь придумать хороший способ предотвратить это вообще. Есть ли хороший общий способ, которым я мог бы написать крючок или просто полностью отключить команду резервного копирования?

(Часть нашей стандартной установки разработчика предназначена для установки пользовательского набора расширений, поэтому у меня уже есть хороший способ установить эти типы правил локально для всей нашей команды разработчиков - я просто не думал о хорошем способ реализации набора правил)

ответ

1

Вот простой крючок на основе Python, который предотвращает повторение слияний. Кредит отправляется в @Oben за то, что он указал мне в правильном направлении.

def prebackout_prevent_backout_merge(ui, repo, **kwargs): 
    '''Don't allow backouts to of merge changesets.''' 

    # Figure out if a --parent version was given or not. 
    backout_to_parent = kwargs['opts'].get('parent', None) 

    # If no parent version was given, proceed. 
    if backout_to_parent is '': 
     return False 

    # Otherwise abort the operation. 
    from mercurial import util 
    raise util.Abort('Backout of a merge changeset is not allowed.') 

Вы можете настроить этот крюк в .hgrc или Mercurial.ini с:

[hooks] 
pre-backout.ttd_prevent_backout_merge = python:PATH_TO_HOOK_SCRIPT:prebackout_prevent_backout_merge 
+0

Эта версия Python определенно является лучшим (и более портативным) выбором для вашего крючка. –

1

Что об этом:.

$ hg --version 
Mercurial Distributed SCM (version 2.6.3) 
... 
$ hg log --graph --template='{rev} {desc}' 
@ 5 c5 
| 
o 4 merge 
|\ 
| o 3 c4 
| | 
o | 2 c3 
|/ 
o 1 c2 
| 
o 0 c1 

$ hg backout 4 
abort: cannot backout a merge changeset 

Так это выглядит, как Mercurial делает то, что вы хотите по умолчанию. Возможно, вам нужна более новая версия Mercurial.

Если вы застряли в старой Mercurial версии, вот Hacky крюк (для * NIX/Bash), который прерывает backouts слияний:

[hooks] 
pre-backout=REV=`echo $HG_PATS | sed -e "s/[^0-9]//g"`; test `hg log -r "parents($REV)" --template='{node}\n' | wc -l` -eq 1 || { echo 'do not do that'; exit 1; } 

Это извлечь номер ревизии $HG_PATS, а затем использует hg log и wc, чтобы подсчитать количество родителей рассматриваемой ревизии. Если есть более одного родителя, это слияние.

Тем не менее, я настоятельно рекомендую использовать последнее Mercurial: проверьте release notes на интересные функции, которые вам не хватает.

+0

К сожалению, из Mercurial 2.8, она по-прежнему можно отката слияния, используя --parent вариант (он помечается устарел, но все же работает). Это также «помогает» в диалоговом окне TortoiseHg, который просто просит вас выбрать родителя. Мне нужно мое решение для работы в Windows, но я посмотрю, смогу ли я сделать что-то вроде вашего крючка. –

+0

Oben - спасибо за помощь. Я не знал о крючке с предварительным резервом. Я отправил ответ, на который я пришел, как принятый ответ, но наградил вас щедростью, так как ваша помощь - это то, что поставило меня на правильный путь. –

+0

Достаточно честный. Рад, что смог помочь. И я не знал о опции «--parent», спасибо, что указали это. –

Смежные вопросы