Как мне работать с закрытыми топологическими головами в Mercurial?

Пытаясь проинтегрировать интеграцию между Kiln и Bamboo, я столкнулся с проблемой, которая, как указала поддержка Fog Creek, может быть проблемой слишком большого количества топологических головок в моем хранилище. У нас обычно есть шаблон закрытия ветви перед слиянием обратно в основную ветку, но об этом явно забывают время от времени.

$ hg head -t | grep ^changeset: | wc -l
1361

Насколько я понимаю, эти головки должны сообщаться тем или иным образом при извлечении из сервера Mercurial, чтобы узнать, какие головки необходимо синхронизировать. Это много потраченных впустую усилий, учитывая, что более 1100 из этих голов полностью мертвы для нас - поэтому я хотел бы избавиться от этих голов!

Это довольно просто определить головы, которые я хочу устранить:

$ hg log -r "heads(all()) - ( head() and not closed() )" --template "{node}\n" | wc -l
1199

Первоначально я думал, что было бы довольно просто очистить это:

  1. Создать новую фиктивную ветку
  2. Итеративно объединить все замкнутые топологические головы в фиктивную ветвь (оставить локальным)

К сожалению, я столкнулся с парой проблем:

  • Если я запустил фиктивную ветку из моей текущей головы по умолчанию, слияния заняли бы очень много времени (я предполагаю, что на все 1100+ слияний потребуется несколько недель)
  • Если я начну с набора изменений 0, я быстро столкнусь с неоднозначной проблемой слияния, которую я не знаю, как решить ("неоднозначное слияние - выбранное действие"?)

Любые идеи или предложения о том, как мне поступить? Является ли моя идея повторного слияния вменяемой? Является ли одна из двух идей о том, с чего начать, более разумной, чем другая?

Любая помощь очень ценится!

2 ответа

Решение

Самый быстрый способ сделать слияние без операции - через hg debugsetparents, Например:

hg update REV1
hg debugsetparents . REV2
hg commit -m "No-op merge"

Обратите внимание, что . после debugsetparents не является опечаткой, но относится к родителю текущей проверки. Также обратите внимание, что hg debugsetparents позволяет выполнить псевдо-"слияние" с прямым предком, что обычно не допускается слиянием. Хотя это не должно иметь каких-либо вредных последствий для самого Mercurial, другие инструменты, взаимодействующие с хранилищем, могут быть перепутаны, поэтому вам следует избегать неправильного использования hg debugsetparents где одна родительская ревизия будет предком другой.

Во-вторых, обратите внимание, что обычно мало смысла в использовании --close-branch закрыть уже слитые ветки. Закрытый флаг на практике используется только hg branchesи вы можете использовать hg branches --active а также hg branches -a к ветвям элиты, которые не имеют активных голов (аналогично, head() and heads(all()) and not closed() как revset для всех ветвей, которые не активны или не закрыты). Следовательно, более простым решением может быть избавление от всех тех топологических головок, которые существуют только для закрытия ветвей.

Некоторые (возможно не связанные) заметки

  • Слитые ветви НЕ производят топологические головки, поэтому - закрытие веток до слияния - это просто потраченное время, я думаю, что большинство из 1361 головок являются заброшенными и заброшенными ветвями (а это "вредные привычки")
  • Трубопровод к выводу grep head не нужен: hg heads является шаблонной командой, вы можете (вместо grep) иметь -T "{node|short}\n" в головах команды или что-то вроде этого (строка на changeset в выводе)

Решение

Вы можете создать временную ветвь слияния (лучше - из текущей подсказки, см. Ниже) и выполнить фиктивные слияния всех нежелательных | ненужных головок в этом слиянии (фиктивные слияния бывают быстрыми и неинтерактивными, то есть легко автоматизированными) и объединить слияние обратно в Подсказка (также возможно с фиктивным слиянием, хотя это и не нужно на этом этапе - глава слияния не будет изменена вообще после всех слияний).

Объединение топологических заголовков в Merger может быть (я полагаю) автоматизированным - я не могу иметь полный рабочий код для вас, только подсказки:

  1. Трехлинейный из вики можно использовать как shell-скрипт с одним параметром "REV to merge"
  2. В hg -y merge --tool=internal:fail REV REV - это любой идентификатор объединенной ревизии (changeset-id, номер локальной ревизии), который вы можете получить из списка hg heads -t -T "TEMPLATE" и направить его в xargs, который выполняет shell-скрипт сверху
Другие вопросы по тегам