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

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

Пока что самое близкое, что я могу сделать, это выполнить слияние обычным способом, оставить все конфликты неразрешенными (файл за раз...), а затем hg vdiff -rHead1 -rHead2 - но vdiff (используя kdiff3), похоже, не имеет параметры для передачи инструменту выходного каталога (текущего рабочего каталога) и вместо этого запускает выходной каталог как временный каталог (возможно, -o - это ответ?).

Позвольте мне сказать по-другому - я хочу использовать kdiff для объединения двух головок в мой рабочий каталог. Я хочу, чтобы результаты в моем рабочем каталоге были моим слиянием, которое я могу зафиксировать.

Должно быть, я упускаю что-то очевидное, я не могу быть единственным, кто хочет это сделать.


person jsaylor    schedule 29.04.2009    source источник
comment
Меня немного смутила формулировка вопроса. Наборы изменений в Mercurial — это неизменные части истории; здесь IIUC вы хотите объединить все дерево файлов сразу, а не файл за файлом.   -  person Éric Araujo    schedule 03.04.2014


Ответы (5)


Я придумал решение, которое достигает того, чего я хочу, но я все еще чувствую, что это кладж.

  • Начните с пустого рабочего каталога с двумя головками: Моя и Их.
  • Обновить рабочий каталог до моего:
    hg update [My head's rev here]
  • Выполните слияние, но откажитесь от всех файлов, которые Merc не может обработать автоматически, без запуска инструмента слияния, и сохраните «Мои» файлы в случае конфликта:
    hg --config "ui.merge=internal:fail" merge

См. https://www.mercurial-scm.org/wiki/TipsAndTricks#head-9f405488b6d3b3d092a09aafa28db515ba44c742, чтобы узнать, как выполнить слияние/сбой.

Теперь у меня есть рабочий каталог со всем, что может понять auto, но все оставшиеся файлы все еще нетронуты Mine. (Используйте hg resolve -l, чтобы увидеть статус разрешения текущих файлов в Mercurial)

  • Теперь я могу сравнивать свой рабочий каталог с заголовком «Их», что дает мне высокоуровневое слияние наборов изменений, которое я искал.

hg vdiff -r [Theirs head's rev here]

Примечание. Если вы используете WinMerge для своего vdiffs , убедитесь, что он имеет переключатель /r в качестве параметра, который будет выполнять сравнение подкаталогов и, если конфигурация WinMerge настроена на использование Tree-View, даст отличное сравнение дерева. Из Mercurial.ini:

[extdiff]
cmd.vdiff = C:\Program Files\WinMerge\WinMergeU.exe
opts.vdiff = /e /ub /r /dl other /dr local

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

  • Когда закончите, используйте разрешение, чтобы отметить все файлы, разрешенные для Merc, а затем зафиксируйте.
    hg resolve -m

Вау! Надеюсь, это поможет кому-то еще!

person jsaylor    schedule 17.06.2009
comment
Похоже на идеальное, хотя и действительно глупое решение :) Вы должны принять это как свой собственный ответ. - person Geoffrey Zheng; 28.12.2010

Я передал вопрос #mercurial на irc.freenode.net пару дней назад. mpm (автор Mercurial) дал своего рода ответ (это была только половина ответа, поэтому я не стал сразу его приводить). Он сказал, что можно сделать что-то, позволив Mercurial автоматически объединять файлы (и вставлять маркеры слияния <<<< и >>>> там, где есть конфликты).

Затем используйте инструмент слияния, который знает об этих маркерах: это позволит вам разрешить их все сразу, вместо того, чтобы делать это для каждого файла отдельно. Отправной точкой может быть страница настройки инструмента слияния. Это объясняет, что

[ui]
merge = internal:merge

заставит Mercurial вставить маркеры слияния. Здесь я проверил это, создав два файла x.txt и y.txt, которые затем модифицировал с конфликтующими изменениями в двух клонах. Слияние просто дало:

% hg merge
merging x.txt
warning: conflicts during merge.
merging x.txt failed!
merging y.txt
warning: conflicts during merge.
merging y.txt failed!
0 files updated, 0 files merged, 0 files removed, 2 files unresolved
use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon

Все файлы были обработаны за один раз, мне не пришлось ничего подтверждать для каждого файла, как вы описываете.

Файлы теперь содержат такие маркеры слияния:

% cat x.txt
foo
<<<<<<< local
hehe
=======
foobar
>>>>>>> other

Следующий шаг — найти инструмент, который может взять дерево каталогов с такими файлами и разрешить их. Я посмотрел на kdiff3, но не понял, как использовать его для работы только с одним файлом, кажется, он очень сосредоточен на сравнении пар файлов/каталогов.

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

person Martin Geisler    schedule 03.06.2009
comment
Вы были близки к идее оставить неразрешенные файлы без дела. Я думаю, что нашел более полный ответ, но используя эту стратегию, которую я только что разместил здесь. - person jsaylor; 17.06.2009
comment
Я очень рад, что вы, по крайней мере, нашли способ добиться этого, хотя это и не идеальный способ. Можно было бы сделать расширение, чтобы улучшить рабочий процесс, но я сам делаю так мало слияний, что не буду его писать :-) - person Martin Geisler; 18.06.2009

Я думаю, что это отвечает ваш вопрос.

person Jim Hunziker    schedule 03.06.2009
comment
Хорошая статья, но я все еще хочу объединить головы (а не наборы изменений в средней ветке). Мой вопрос был не совсем ясен по этому поводу. - person jsaylor; 17.06.2009

похоже, вам нужна команда extdiff:

у меня есть это в моем ~/.hgrc (я предпочитаю meld, но вы можете изменить его на kdiff3 и т. д.)

[extensions]
hgext.extdiff =

[extdiff]
# add new command called meld, runs meld (no need to name twice)
cmd.meld =

С extdiff ваши слияния происходят в вашем рабочем каталоге, и, кроме того, вы можете передать любые дополнительные параметры вашей программе сравнения с -o:

$ hg help extdiff

hg extdiff [ОПТ]... [ФАЙЛ]...

использовать внешнюю программу для сравнения репозитория (или выбранных файлов)

Show differences between revisions for the specified files, using
an external program.  The default program used is diff, with
default options "-Npru".

To select a different program, use the -p option.  The program
will be passed the names of two directories to compare.  To pass
additional options to the program, use the -o option.  These will
be passed before the names of the directories to compare.

When two revision arguments are given, then changes are
shown between those revisions. If only one revision is
specified then that revision is compared to the working
directory, and, when no revisions are specified, the
working directory files are compared to its parent.

опции:

-p --программа сравнения программ для запуска
-o --option передать параметр программе сравнения
-r --rev версии
-I --включать имена, соответствующие заданным шаблонам
-X --exclude исключить имена, соответствующие заданным шаблонам

person Paul Ivanov    schedule 09.06.2009
comment
Моя проблема в том, что это по-прежнему файл за файлом, и он не дает мне полного подхода к слиянию наборов изменений и наборов изменений. - person jsaylor; 17.06.2009

Попробуйте настроить ui.merge. Дополнительную информацию см. на этой странице.

person Nathan Kitchen    schedule 29.04.2009
comment
возможно, мой вопрос недостаточно ясен - независимо от настройки ui.merge, я все равно получу слияние файлов за раз из mercurial, а не слияние всего набора изменений и набора изменений (если я что-то не упустил ?) - person jsaylor; 30.04.2009
comment
Я все еще немного запутался - разве вам не нужен kdiff, чтобы показывать вам конфликтующие файлы по одному? Или он может решить все ваши конфликты без ручного вмешательства? - person Nathan Kitchen; 30.04.2009