Как проверить коммиты ребаз в хуке? - PullRequest
0 голосов
/ 09 декабря 2011

Ниже мой хук для сообщения коммита, он отлично работает для всех слияний и коммитов, которые выполняются вручную.Когда я пытаюсь использовать его с rebase, он перестает говорить

"Эта ветвь только для Merge Commits, здесь нельзя зафиксировать код напрямую".

Он напрямую фиксирует код по умолчанию.Разве это не слияние?

Необходимость ловушки состоит в том, чтобы избежать любых прямых фиксаций в ветке по умолчанию, а фиксация должна выполняться только в ветке функции (другие ветки, отличные от стандартной).Кроме того, если в ветви не соблюдается правильное соглашение об именах, оно не будет выполнено

Пожалуйста, дайте мне знать, как я могу разрешить коммиты rebase или я что-то упустил на крючке?

import re

def commitmessage(ui, repo, *args, **kwargs):
    changectx = repo[kwargs['node']]
    if changectx.branch() == 'default' :
        if kwargs['parent2'] == '':
            if changectx.rev() == 0:
                return 0
            tagsfilepresent = 0
            totalfiles = 0
            for aFile in changectx.files():
                totalfiles = totalfiles + 1
                if aFile == '.hgtags':                  
                    tagsfilepresent = 1
            if totalfiles == 1 and tagsfilepresent == 1:
                return 0
            ui.write(changectx.branch() + ' This branch is only for Merge Commits, cannot commit the code directly here\n\n')
            return 1
        secondarybranchname = repo[kwargs['parent2']].branch()
        ui.write('Merging ' + secondarybranchname + ' to default\n')
        ui.write('Merge Commit Successful to default for ticket: ' +  secondarybranchname[1:] + '\n')
        return 0
    m = re.match('^t(\d{4,5})$', changectx.branch())
    if m:
        ui.write('Commit Successful to ' + m.group(1) + '\n')
        return 0
    else:
        ui.write('Branch name is not Acceptable, it should be either default or t(numeric)\n')
        return 1
    ui.write('If you think this special case is not handled here, please notify' + '\n')
    return 1

1 Ответ

1 голос
/ 09 декабря 2011

Похоже на Руководство по RebaseExtension ясно показывает, что происходит.

Rebase не является слиянием (не hg merge).Если это так, зачем делать ребаз, почему бы не объединить?На самом деле, в большинстве случаев ближе к использованию очереди исправлений, чтобы взять некоторые ревизии с их места и перейти к другому родителю.Для истории ревизий это выглядит так, как будто вы удалили несколько ревизий и зафиксировали другие (на самом деле очень похожие, но не одинаковые) над новым родителем.Вот почему kwargs['parent2'] == '' соответствует действительности.

Чтобы увидеть, что именно происходит с историей, вам лучше внимательно прочитать руководство RebaseExtension .

Операция включает объединение измененийдля разрешения конфликтов между исходным родителем и целевым.Это то, что делает расширение пригодным для использования, когда очередь исправлений не может помочь: вы не можете применить исправление через очередь, если какой-либо кусок в исправлении не совпадает точно с содержимым целевого файла.Но это касается только содержимого файлов, а не истории.В конце концов, TortoiseHg также может объединять локальные изменения во время операции обновления, но это не «hg merge».

Таким образом, перебазировка противоречит вашей политике запрещения фиксации в ветке «по умолчанию», и вы, кажется,есть довольно хороший крюк, если он останавливается здесь.Я думаю, что вы должны использовать обычную команду слияния, чтобы внести свои изменения в ветку.

...