Я не совсем уверен, что именно вы хотите сделать; Я предполагаю, так что поправьте меня, если я ошибаюсь.
Во-первых, практически всем инструментам слияния требуется два или три файла для выполнения слияния. Так устроены эти инструменты; инструменты, которые напрямую работают с файлами с маркерами конфликтов, довольно редки. Это, однако, зависит от вашего выбора инструмента, который это делает; 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