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

219

Недавно я использовал 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-tool?

Джозеф
источник
Связанный пост - Как настроить diff инструмент в Git в целом .
RBT

Ответы:

376

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

git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/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/kdiff3.exe"
git config --global difftool.kdiff3.trustExitCode false

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

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

Джозеф
источник
5
Тем не менее, почему я хочу, чтобы git-difftool не завершал работу, если kdiff3 не работает?
Дэвид Торрес
9
Чтобы я мог распознавать инструмент сравнения в Visual Studio 2015, мне пришлось изменить эту строку git config --global --add diff.guitool kdiff3 следующим образом: git config --global --add diff.tool kdiff3
Гийом Раймонд
2
@DavidTorres Вероятно, потому что плохо ведущие себя инструменты Windows (которые выходят с ненулевыми кодами в случае успеха) разрушают его для всех.
Мэтью
2
В соответствии с указанными документами установка для параметра trustExitCode значения false не требуется, поскольку по умолчанию его все равно игнорируют.
Мэтт Уилки
7
AFAIK, --addдобавит вторую или третью запись при вызове несколько раз. Это трудно исправить позже, потому что его нельзя просто удалить с помощью --remove. Просто установите значение без --addдолжно быть в порядке.
Томас Веллер
58

Просто чтобы расширить ответ @ Джозефа :

После применения этих команд ваш глобальный .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
Игорь Кустов
источник
@ Alex78191, мой ответ отражает ответ Иосифа, и там вы можете найти более подробную информацию об этой настройке.
Игорь Кустов
5
Мне потребовалось много времени, чтобы понять это правильно. 2 вещи сбили меня с пути: (1) .gitconfigФайл, который я редактировал, не был тем, который использовался. См. Stackoverflow.com/questions/2114111/… для определения загружаемых. (2) Не смешивайте и не сопоставляйте cmd =и path =в gitconfig, TL; DR: удалите cmd и просто используйте путь
Matt Wilkie
1
Теперь на git bash используйте .... git difftool <filename> или простой git difftool для запуска diff gui kdiff3, который вы только что установили.
Вивек
32

Для пользователей 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
Не используйте, --addтак как это может привести к 2 записям конфигурации, если вы запустите команду дважды. Это убирает беспорядок, потому что вы больше не можете удалить ни одной записи. См. Git-scm.com/docs/git-config : «Несколько опций могут быть добавлены к опции»
Томас Веллер
11

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

user3159253
источник
8

Мне нужно было добавить параметры командной строки, иначе 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".

См. Коммит c217b93 , коммит 57ba181 , коммит 063f2bd (24 октября 2018 г.) от Denton Liu ( Denton-L) .
(Слиты Junio C Hamano - gitster- в фиксации 87c15d1 , 30 окт 2018)

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

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

VonC
источник
5

(Когда я пытался выяснить, как использовать 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
кола
источник