Подтвердить что ты не робот

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

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

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

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

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

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

Я запускаюсь в Windows и устанавливаю Git -extensions.

Вопрос Simillar, специфичный для kdiff3, также был задан здесь: Kdiff3 не откроется командой mergetool

4b9b3361

Ответ 1

Git имеет --auto жестко закодирован как опция командной строки для kdiff3, что приводит к тому, что gui не появляется, если все конфликты автоматически разрешаются 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 как mergetool глобально, а kdiff3 всегда будет отображаться при разрешении конфликтов.

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

Ответ 2

Вместо того, чтобы настраивать mergetool, который вызывается только тогда, когда есть конфликт, просто установите слияние с kdiff:

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

Ответ 3

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

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

Похоже, что источник для команды по умолчанию для инструмента слияния kdiff3 находится в файле git/mergetools/kdiff3. Это выглядит как shell script, поэтому мы должны точно его скопировать! Полагая это на одну строку, удаляя --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 просто вызывает внешний инструмент для версий файлов, которые необходимо объединить.