Git: как настроить KDiff3 как инструмент слияния и инструмент сравнения

Недавно я использовал GitExtension 2.46, но версия Git с такой же версией - 1.9.4.msysgit.2. Желая использовать только команды Git, я удалил GitExtension и установил последнюю доступную версию Git и KDiff3.

Когда я выполняю слияние и возникают конфликты, я запускаю следующую команду:

$ git mergetool

Затем я получаю сообщение:

Инструмент слияния kdiff3 недоступен как kdiff3.

Думаю, это должно быть по пути KDiff3.

Окружающая среда

  • ОС: Windows 10
  • Git 2.6.1.windows.1
  • KDiff3 0.9.98 (64-разрядная)

Вопросы:

  • Что мне нужно настроить в файле .gitconfig для команды $ git mergetool, чтобы открыть графический интерфейс KDiff3 с версиями LOCAL, REMOTE, BASE и ОБЪЕДИНЕНЫ конфликтующего файла?

  • Как настроить его для использования с инструментом diff?


person Joseph    schedule 23.10.2015    source источник
comment
Связанное сообщение - Как настроить инструмент сравнения в Git в целом.   -  person RBT    schedule 06.04.2018
comment
С Git 2.33+ (3 квартал 2021 г.) git config --global merge.tool kdiff3 будет достаточно. См. мой обновленный ответ ниже   -  person VonC    schedule 09.07.2021


Ответы (7)


Эти сайты были почти очень полезны, mergetool и difftool. Я использовал глобальную конфигурацию, но может быть использован репозиторием без проблем. Вам просто нужно выполнить следующие команды:

git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/bin/kdiff3.exe"
git config --global mergetool.kdiff3.trustExitCode false

git config --global diff.guitool kdiff3
git config --global difftool.kdiff3.path "C:/Program Files/KDiff3/bin/kdiff3.exe"
git config --global difftool.kdiff3.trustExitCode false

Обратите внимание, что последняя версия kdiff3 переместила исполняемый файл из корня папки приложения C: / Program Files / KDiff3 в папку bin / внутри папки приложения. Если вы используете старую версию, удалите bin / из указанных выше путей.

Использование параметра trustExitCode зависит от того, что вы хотите сделать, когда вернется инструмент сравнения. Из документации:

git-difftool вызывает инструмент сравнения отдельно для каждого файла. Ошибки, сообщаемые инструментом сравнения, по умолчанию игнорируются. Используйте --trust-exit-code, чтобы git-difftool выйти, когда запущенный инструмент сравнения возвращает ненулевой код выхода.

person Joseph    schedule 26.10.2015
comment
Тем не менее, почему мне нужно, чтобы git-difftool не выходил из строя, если kdiff3 не работает? - person David Torres; 16.02.2017
comment
Чтобы Visual Studio 2015 распознала инструмент сравнения, мне пришлось изменить эту строку git config --global --add diff.guitool kdiff3 на это: git config --global --add diff.tool kdiff3 - person Guillaume Raymond; 11.04.2017
comment
@DavidTorres Вероятно, потому, что плохо работающие инструменты Windows (которые в случае успеха выходят с ненулевым кодом) разрушают его для всех. - person Matthew Flaschen; 27.06.2017
comment
Согласно указанным документам установка trustExitCode в false не требуется, поскольку по умолчанию все равно игнорируется. - person matt wilkie; 26.10.2017
comment
AFAIK, --add добавит вторую или третью запись при многократном вызове. Это трудно исправить позже, потому что это нельзя просто удалить с помощью --remove. Просто установка значения без --add должна быть в порядке. - person Thomas Weller; 06.03.2018
comment
Хорошее замечание @ThomasWeller, ответ был обновлен, чтобы отразить ваше предложение - person Joseph; 14.02.2020
comment
Есть ли способ по умолчанию использовать KDiff3 при вводе git diff? - person trustory; 08.06.2020
comment
Лол, я отказался от этого, но ты заставил его работать за секунды. Большое спасибо - person jjstcool; 27.05.2021

Просто чтобы расширить ответ @ Joseph:

После применения этих команд ваш глобальный .gitconfig файл будет иметь следующие строки (для ускорения процесса вы можете просто скопировать их в файл):

[merge]
    tool = kdiff3
[mergetool "kdiff3"]
    path = C:/Program Files/KDiff3/kdiff3.exe
    trustExitCode = false
[diff]
    guitool = kdiff3
[difftool "kdiff3"]
    path = C:/Program Files/KDiff3/kdiff3.exe
    trustExitCode = false
person Igor Kustov    schedule 26.11.2016
comment
@ Alex78191, мой ответ отражает ответ Джозефа, и там вы можете найти более подробную информацию об этой настройке. - person Igor Kustov; 07.05.2017
comment
Мне потребовалось много времени, чтобы понять это правильно. 2 вещи сбили меня с пути: (1) файл .gitconfig, который я редактировал, не использовался. См. stackoverflow.com / questions / 2114111 / для определения загружаемых. (2) Не смешивайте и не сопоставляйте cmd = и path = в gitconfig, TL; DR: удалите cmd и просто используйте путь - person matt wilkie; 26.10.2017
comment
Теперь в git bash используйте .... git difftool ‹filename› или простой git difftool для запуска только что установленного diff gui kdiff3. - person Vivek; 08.01.2018

Для пользователей Mac

Вот принятый ответ @ Joseph, но с указанием пути установки Mac по умолчанию kdiff3

(Обратите внимание, что вы можете скопировать и вставить это и запустить за один раз)

git config --global --add merge.tool kdiff3 
git config --global --add mergetool.kdiff3.path  "/Applications/kdiff3.app/Contents/MacOS/kdiff3" 
git config --global --add mergetool.kdiff3.trustExitCode false

git config --global --add diff.guitool kdiff3
git config --global --add difftool.kdiff3.path "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
git config --global --add difftool.kdiff3.trustExitCode false
person kris    schedule 23.10.2018
comment
Не используйте --add, поскольку это может привести к появлению 2 записей конфигурации, если вы запустите команду дважды. Убирать это беспорядок, потому что вы больше не можете удалить ни одной записи. См. git-scm.com/docs/git-config: можно добавить несколько строк к варианту - person Thomas Weller; 27.03.2019

Проблема в том, что Git не может найти KDiff3 в% PATH%.

В типичной установке Unix все исполняемые файлы находятся в нескольких хорошо известных местах (/bin/, /usr/bin/, /usr/local/bin/ и т. Д.), И можно вызвать программу, просто набрав ее имя в процессоре оболочки (например, cmd.exe :)).

В Microsoft Windows программы обычно устанавливаются по выделенным путям, поэтому вы не можете просто ввести kdiff3 в сеансе cmd и запустить KDiff3.

Сложное решение: вы должны указать Git, где найти KDiff3, указав полный путь к kdiff3.exe. К сожалению, Git не любит пробелы в спецификации пути в своей конфигурации, поэтому в последний раз, когда мне это было нужно, я получил эти древние "C: \ Progra ~ 1 ... \ kdiff3.exe", как будто это было поздно. 1990-е :)

Простое решение: отредактируйте настройки вашего компьютера и включите каталог с kdiff3.exe в% PATH%. Затем проверьте, можете ли вы вызвать его из cmd.exe по его имени, а затем запустите Git.

person user3159253    schedule 23.10.2015

Мне нужно было добавить параметры командной строки, иначе KDiff3 открывался бы только без файлов и запрашивал у меня базовый, локальный и удаленный. Я использовал версию, поставляемую с TortoiseHg.

Вдобавок мне пришлось прибегнуть к старым добрым именам файлов DOS 8.3.

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    cmd = /c/Progra~1/TortoiseHg/lib/kdiff3.exe $BASE $LOCAL $REMOTE -o $MERGED

Однако теперь он работает правильно.

person martin    schedule 26.06.2018

(Пытаясь узнать, как использовать kdiff3 из WSL git, я оказался здесь и получил последние части, поэтому я опубликую свое решение для всех, кто также наткнулся здесь, пытаясь найти этот ответ)

Как использовать kdiff3 в качестве инструмента сравнения / слияния для WSL git

С обновлением Windows 1903 это стало намного проще; просто используйте wslpath, и нет необходимости передавать TMP из Windows в WSL, поскольку сторона Windows теперь имеет доступ к файловой системе WSL через \ wsl $:

[merge]
    renormalize = true
    guitool = kdiff3
[diff]
    tool = kdiff3
[difftool]
    prompt = false
[difftool "kdiff3"]
    # Unix style paths must be converted to windows path style
    cmd = kdiff3.exe \"`wslpath -w $LOCAL`\" \"`wslpath -w $REMOTE`\"
    trustExitCode = false
[mergetool]
    keepBackup = false
    prompt = false
[mergetool "kdiff3"]
    path = kdiff3.exe
    trustExitCode = false

До обновления Windows 1903

Шаги по использованию kdiff3, установленного в Windows 10, в качестве инструмента сравнения / слияния для git в WSL:

  1. Добавьте установочный каталог kdiff3 в путь Windows.
  2. Добавьте TMP в переменную среды Windows WSLENV (WSLENV = TMP / up). Каталог TMP будет использоваться git для временных файлов, как и предыдущие версии файлов, поэтому путь должен быть в файловой системе Windows, чтобы это работало.
  3. Установите для TMPDIR значение TMP в .bashrc:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
  1. Преобразование unix-path в windows-path при вызове kdiff3. Пример моего .gitconfig:
[merge]
    renormalize = true
    guitool = kdiff3
[diff]
    tool = kdiff3
[difftool]
    prompt = false
[difftool "kdiff3"]
    #path = kdiff3.exe
    # Unix style paths must be converted to windows path style by changing '/mnt/c/' or '/c/' to 'c:/'
    cmd = kdiff3.exe \"`echo $LOCAL | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\" \"`echo $REMOTE | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\"
    trustExitCode = false
[mergetool]
    keepBackup = false
    prompt = false
[mergetool "kdiff3"]
    path = kdiff3.exe
    trustExitCode = false
person cola    schedule 14.04.2019

Обновление 2021 года:

В Git 2.33 (3 квартал 2021 г.) в Windows mergetool научили находить kdiff3.exe так же, как он находит winmerge.exe.

git config --global merge.tool kdiff3 достаточно.

См. commit 47eb4c6 (7 июня 2021 г.) по Майкл Шиндлер (michaelcompressconsult).
(Объединено Junio ​​C Hamano - gitster - в фиксации b7bd70d, 8 июля 2021 г.)

mergetools/kdiff3: заставьте kdiff3 работать и в Windows

Подписано: Майкл Шиндлер [email protected]

Собственный kdiff3 mergetool не найден <_10 sup> (man) в Windows.
Сообщение Отображается The merge tool kdiff3 is not available as 'kdiff3'.

Точно так же, как мы переводим имя двоичного файла и ищем его в пути поиска WinMerge, сделайте то же самое для kdiff3, чтобы найти его.


2018:

Чтобы изменить kris 'ответьте, начиная с Git 2.20 (4 квартал 2018 г.), правильная команда для git mergetool будет

git config --global merge.guitool kdiff3 

Это потому, что git mergetool научился использовать параметр --[no-]gui точно так же, как git difftool.

См. фиксацию c217b93, совершить 57ba181, совершить 063f2bd (24 октября 2018 г.), автор: Дентон Лю (Denton-L).
< sup> (объединено Junio ​​C Hamano - gitster - в commit 87c15d1, 30 октября 2018 г.)

mergetool: принять -g/--[no-]gui в качестве аргументов

В соответствии с тем, как difftool принимает параметр -g/--[no-]gui, заставьте mergetool принять тот же параметр, чтобы использовать переменную merge.guitool для поиска mergetool по умолчанию вместо merge.tool.

person VonC    schedule 04.11.2018