Как я могу сделать слияние на основе набора изменений вместо слияния на основе файлов с Mercurial? - PullRequest
8 голосов
/ 30 апреля 2009

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 17 июня 2009

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

  • Начните с пустого рабочего каталога с двумя головами: Моей и Их.
  • Обновление рабочего каталога до шахты:
    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, но все оставшиеся файлы все еще не тронуты с Майна. (Используйте hg resol -l, чтобы увидеть статус разрешения текущих файлов Mercurial)

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

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

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

[extdiff]<br> cmd.vdiff = C:\Program Files\WinMerge\WinMergeU.exe<br> opts.vdiff = /e /ub /r /dl other /dr local
Теперь я могу работать со всем каталогом, который включает неразрешенные файлы, и вносить изменения в проект по мере необходимости (т. Е. Для разрешения одного файла требуются дополнительные изменения в другом).

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

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

3 голосов
/ 03 июня 2009

Я перевел вопрос на #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, но не понял, как использовать его для работы только с одним файлом, он, кажется, очень сосредоточен на сравнении пар файлов / каталогов.

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

1 голос
/ 03 июня 2009

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

0 голосов
/ 09 июня 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 [OPT] ... [FILE] ...

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

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 - опция выбора опции для программы сравнения
-r --rev редакция
-I - включить имена, соответствующие заданным шаблонам
-X - исключить исключить имена, соответствующие заданным шаблонам

0 голосов
/ 30 апреля 2009

Попробуйте установить ui.merge. Подробнее см. на этой странице .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...