Как я могу заставить всегда отображаться графический интерфейс mergetool (KDiff3)?

Как я могу заставить графический интерфейс mergetool всегда отображаться и отключить автоматическое разрешение?

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

Я настроил Git для использования KDiff3 в качестве инструмента слияния сейчас, но это также произошло, когда я указал codecompare в качестве указанного инструмента слияния . Я знаю, что в KDiff3 есть опция "Автоматическое сохранение и выход при слиянии без конфликтов", которая теоретически может вызвать описанное поведение, но у меня эта опция постоянно отключена/снята.

Кроме того, есть опция trustExitCode непосредственно в Git mergetool gitconfig, для которой я установил значение true, но даже если я установил для нее значение false, графический интерфейс не отображается.

Я не уверен, кто делает автоматическое разрешение в любом случае. Mergetool в каком-то препроцессоре или KDiff3?

Я работаю в Windows и у меня установлены Git-расширения.

Аналогичный вопрос, специфичный для KDiff3, также задавался здесь: Kdiff3 не открывается команда средства слияния


person Ondrej Peterka    schedule 10.03.2013    source источник


Ответы (5)


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

В качестве обходного пути я настроил свой собственный вариант KDiff3 в качестве инструмента слияния:

git config --global mergetool.kdiff3NoAuto.cmd "kdiff3 --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\""

Это очень похоже на то, что Git использует по умолчанию для KDiff3, но без флага --auto.

Теперь вы можете вызвать git mergetool -t kdiff3NoAuto или настроить kdiff3NoAuto как инструмент слияния глобально, и KDiff3 всегда будет отображаться при разрешении конфликтов.

Что касается второй части вашего вопроса, если вы действительно хотите отключить автоматическое разрешение, просто добавьте --qall в командную строку kdiff3 выше. Но тогда вам придется вручную разрешать все изменения в файле, даже те, которые не привели к конфликту Git. Лучший сценарий: KDiff3 показывает, как Git объединил файлы, и оставляет конфликты открытыми для выбора пользователем.

person PiQuer    schedule 04.04.2013
comment
Вауу, это здорово. Спасибо! Вы также можете ответить на связанный вопрос или оставить там комментарий, поскольку, вероятно, в конце концов это та же самая проблема. - person Ondrej Peterka; 04.04.2013
comment
Спасибо. Я связался с этим ответом в другом вопросе. - person PiQuer; 05.04.2013
comment
Добавление '--auto' к игнорируемому параметру командной строки помогло мне с KDiff3 0.9.98 (64-разрядная версия). Меню «Настройки» -> «Настроить KDiff3» -> вкладка «Интеграция». Появится диалоговое окно с информацией об автоматическом разрешении, но затем отобразится результирующее слияние, позволяющее дальнейшее редактирование. - person bob esponja; 07.08.2017
comment
@bobesponja Почему бы не добавить свое решение в качестве ответа? :) - person Neal Gokli; 14.04.2018

Комментарий Боба Эспони к принятому ответу отлично сработал для меня, используя KDiff3 0.9.98.

Добавьте --auto в параметры командной строки, которые следует игнорировать в разделе

Settings | Configure KDiff3... | Integration tab.

KDiff3 открывает диалоговое окно «Конфликты», в котором указано Количество неразрешенных конфликтов: 0, но затем вы можете проверить/изменить состояние слияния по мере необходимости.

Это немного удобнее, чем настраивать свой собственный вариант, поскольку он будет работать по назначению, будь то из git mergetool, исходного дерева или любого другого инструмента, использующего mergetool.

person jamezzz    schedule 24.04.2020
comment
ОБРАТИТЕ ВНИМАНИЕ НА ДВОЙНОЕ ТИРЕ: '--auto'. Во всех значениях по умолчанию Kdiff3 уже использовал один тире (подразумевающий '-auto'), который я попробовал первым... но один тире у меня не сработал. - person deasserted; 28.08.2020

Поведение git mergetool полностью зависит от выбранного инструмента слияния и командной строки, которую Git передает ему. Поэтому, чтобы изменить его поведение, вам нужно найти командную строку, которая делает то, что вы хотите, и настроить Git для использования этой командной строки.

У меня самого был этот вопрос (в частности, в отношении KDiff3), и ответ PiQuer помог мне частично, но он получил мне думать. Должен быть способ точно воспроизвести поведение Git по умолчанию для KDiff3, за исключением опции --auto (из-за которой KDiff3 не отображает графический интерфейс).

Похоже, что исходный код команды по умолчанию для инструмента слияния KDiff3 находится в файле git/mergetools/kdiff3. Это похоже на сценарий оболочки, поэтому мы должны иметь возможность точно его скопировать! Поместив это в одну строку, удалив --auto и экранировав вещи, мы получим следующее:

git config --global mergetool.kdiff3.cmd "if \"\$base_present\"; then \"\$merge_tool_path\" --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; else \"\$merge_tool_path\" --L1 \"\$MERGED (Local)\" --L2 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; fi"

Переменные base_present и merge_tool_path специально не упоминаются в документации Git как доступные для использования в mergetool.<tool>.cmd, поэтому в какой-то момент в будущем эта команда может перестать работать как есть. Однако их можно легко заменить командой для проверки того, относится ли BASE к существующему файлу и жестко запрограммированному пути для KDiff3 соответственно.

Обратите внимание, что приведенная выше команда заменяет команду по умолчанию для инструмента слияния Git kdiff3, а не создает отдельную команду.

Относительно пары других моментов в исходном вопросе:

  • Параметр trustExitCode сообщает Git, является ли код выхода инструмента слияния правильным показателем того, было ли слияние успешным. Это не повлияет на поведение инструмента слияния, а скорее на поведение Git после выхода из инструмента слияния. См. руководство по git-mergetool.
  • Автоматическое разрешение, которое вы видите после ввода git mergetool, выполняется самим инструментом слияния. git mergetool просто вызывает внешний инструмент для версий файлов, которые необходимо объединить.
person Joel Davies    schedule 28.02.2017
comment
Как это отменить? Я выполнил команду, теперь kdiff3 вообще больше не открывается, и я понял, что команда, вероятно, только для Linux, пока я нахожусь в Windows. Как вернуться к поведению по умолчанию? - person hunger; 08.07.2019
comment
Вы используете git config --unset для удаления настроек. Если вы использовали именно ту команду, которую я дал выше, то git config --global --unset mergetool.kdiff3.cmd удалит только этот параметр. Этот параметр определенно отлично работает в Windows. Я в основном использую Git в Windows. Не знаю, почему у вас возникла проблема. Одна вещь, которая может понадобиться для того, чтобы это работало (в зависимости от вашей системы), это установить для mergetool.kdiff3.path полный путь к KDiff3. - person Joel Davies; 09.07.2019
comment
Я был неправ. Я не осознавал, что на самом деле я был в среде WSL/Ubuntu Windows 10, где я не могу использовать kdiff3. Итак, после выхода из WSL в Windows я в конечном итоге использовал решение PiQuer (чтобы я не перезаписывал команду kdiff3 снова), которое работает, но я надеюсь, что ваше решение также сработает. Спасибо. - person hunger; 09.07.2019

Вместо настройки средства слияния, которое вызывается только при возникновении конфликта, просто настройте драйвер слияния с помощью KDiff3:

git config merge.kdiff.driver 'kdiff3  "%O" "%A" "%B" -o "%A" --L1 "Nearest Common ancestor"  -L2 "Working Copy" --L3 "Version from Other Branch"'

Вы можете сделать этот драйвер глобальным, добавив --global. Но вам нужно добавить .gitattribute в свой репозиторий:

*  merge=kdiff
person sophana    schedule 20.05.2016

Если проблема строго связана с авторазрешением нежелательных конфликтов...

Как только KDiff3 откроется, вы можете просто нажать Merge / Set Deltas to Conflicts в меню, и состояние изменится на красивую, управляемую человеком проблему разрешения конфликтов.

person Patrizio Bertoni    schedule 20.03.2019