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 и MERGED конфликтующего файла?

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

Ответ 1

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

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

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

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

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

Ответ 2

Просто чтобы увеличить ответ @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

Ответ 3

Для пользователей 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

Ответ 4

Проблема в том, что 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.

Ответ 5

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

Кроме того, мне нужно было обратиться к старым добрым именам файлов DOS 8.3.

[merge]
    tool = kdiff3

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

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

Ответ 6

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

git config --global merge.guitool kdiff3 

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

См. Коммит c217b93, коммит 57ba181, коммит 063f2bd (24 октября 2018 г.) Дентона Лю (Denton-L).
(Объединено Джунио С. Хамано - gitster - в коммите 87c15d1, 30 октября 2018 г.)

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

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

Ответ 7

(Когда я пытался выяснить, как использовать 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 в переменную среды WSLENV Windows (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

Ответ 8

Я только что установил KDiff3.exe в каталог C:\Program Files\KDiff3 и это решило мою проблему.