it-roy-ru.com

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

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

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

$ git mergetool

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

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

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

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

  • ОС: Windows 10
  • Git 2.6.1.windows.1
  • KDiff3 0,9,98 (64 бита)

Вопросы:

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

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

180
Joseph

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

319
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
46
Igor Kustov

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

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

10
user3159253

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

git config --global merge.guitool kdiff3 

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

Смотрите коммит c217b9 , коммит 57ba181 , коммит 063f2bd (24 октября 2018 г.) по Дентон Лю (Denton-L) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 87c15d1 , 30 октября 2018 г.)

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

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

5
VonC

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

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

[merge]
    tool = kdiff3

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

Тем не менее, это работает правильно сейчас.

4
martin

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

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

Шаги для использования 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
1
cola