Могу ли я использовать KDiff3 для обработки маркеров конфликтов? (меркуриал)

Может ли KDiff3 интерпретировать стандартные маркеры конфликтов различий?

Объяснение:

В настоящее время у меня есть установка KDiff3 в качестве инструмента слияния в Mercurial. Я запускаю свои слияния (например, hg merge) из сеанса терминала, и когда возникает конфликт, Mercurial вызывает KDiff3 для трехстороннего слияния, как и ожидалось.

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

Я хотел бы передать инструмент слияния команде разрешения (например, hg resolve --tool kdiff3 file.txt), но похоже, что KDiff3 не обрабатывает маркеры конфликта и вместо этого хочет, чтобы три файла были предоставлены в качестве аргументов командной строки.

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


person Jonathon Watney    schedule 11.12.2015    source источник


Ответы (1)


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

Во-первых, практически всем инструментам слияния требуется два или три файла для выполнения слияния. Так устроены эти инструменты; инструменты, которые напрямую работают с файлами с маркерами конфликтов, довольно редки. Это, однако, зависит от вашего выбора инструмента, который это делает; Mercurial и kdiff3 не могут вам помочь, если это то, что вам нужно: вам понадобится другой инструмент.

Во-вторых, давайте подробно рассмотрим, как настраиваются инструменты слияния. Вы можете просмотреть hg help mergetools для списка доступных инструментов слияния и способов их выбора, а также hg help config.merge-tools (обратите внимание на тире) для необходимых параметров конфигурации. Вы можете просмотреть настройки kdiff3, выполнив следующие действия:

hg config merge-tools | grep -w kdiff3

По умолчанию merge-tools.kdiff3.premerge не должен быть установлен, поэтому hg merge сначала попытается использовать свой внутренний алгоритм слияния для разрешения конфликтов и вернется к kdiff3 (при условии, что вы выбрали его в качестве инструмента слияния) только для файлов, которые не могут быть разрешены без конфликтов. Как вызывается kdiff3, можно увидеть, выполнив:

hg config merge-tools.kdiff3.args

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

Что вы можете сделать, если вы не хотите, чтобы вас выбрасывали в инструмент слияния по умолчанию, если есть конфликты — и я не знаю, насколько близко это подходит к тому, что вы хотите — это сначала выполнить слияние с одним из внутренних инструментов :merge , :merge3 или :fail. Либо :merge, либо :merge3 поставит маркеры конфликта в файлы, которые он не может объединить внутренне, и пометит те, которые он может объединить, как разрешенные, а остальные - как неразрешенные. Инструмент слияния :fail помечает как неразрешенные все файлы, в которых есть изменения с обеих сторон, даже если конфликты могут быть разрешены (и не добавляет маркеры конфликтов). Это можно сделать, например, с помощью:

hg merge --tool :merge

На этом этапе у вас будут некоторые конфликты, которые внутренний инструмент слияния Mercurial смог разрешить, а некоторые — нет (отметьте hg resolve -l, чтобы увидеть их статус, или hg resolve -l -T '{ifeq(status,"U","{path}\n","")}', чтобы просто перечислить неразрешенные файлы).

Затем вы можете вызвать hg resolve --tool kdiff3 FILE (параметр --tool kdiff3 также можно опустить, если kdiff3 является вашим инструментом слияния по умолчанию) для разрешения любых конфликтов в FILE. Mercurial сгенерирует локальную, базовую и другие версии перед вызовом инструмента слияния; как часть этого процесса, все маркеры конфликта в локальном файле будут стерты, так как этот файл будет заменен новой копией первого родителя рабочего каталога.

person Reimer Behrends    schedule 14.12.2015
comment
Спасибо, @Reimer. Я отсканировал ваш ответ и проверю его позже. - person Jonathon Watney; 14.12.2015