Как я могу заставить графический интерфейс 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
Ответы
Ответ 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
просто вызывает внешний инструмент для версий файлов, которые необходимо объединить.