Git: Як налаштувати KDiff3 як інструмент злиття та інструмент diff


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"?


Відповіді:


375

Ці веб-сайти були дуже корисні, майже, 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 окремо для кожного файлу. Помилки, про які повідомляється інструментом diff, за замовчуванням ігноруються. Використовуйте --trust-exit-код, щоб зробити вихід git-difftool, коли викликаний інструмент diff повертає ненульовий код виходу.


5
Тим не менш, чому я хочу, щоб git-difftool не вийшов, якщо kdiff3 не вдалося?
Девід Торрес

9
Для того, щоб інструмент "diff" був визнаний Visual Studio 2015, мені довелося змінити цей рядок git config --global --add diff.guitool kdiff3 на це: git config --global --add diff.tool kdiff3
Гійом Реймонд,

2
@DavidTorres Ймовірно, тому, що погано поводилися інструменти Windows (вихід із ненульовими кодами на успіх) руйнують його для всіх.
Метью Флашен

2
Відповідно до посилань на документи, встановлення trustExitCode на false не є необхідним, оскільки за замовчуванням це все одно ігнорувати.
matt wilkie

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 <ім'я файлу> або простий git difftool для запуску diff gui kdiff3, який ви просто встановили.
Вівек

32

Для користувачів Mac

Ось прийнята відповідь @ Джозефа, але з місцем розташування шляху для встановлення 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 : "До опції можна додати кілька ліній"
Thomas Weller

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.


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-L) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті 87c15d1 , 30 жовтня 2018 р.)

mergetool: прийняти -g/--[no-]guiяк аргументи

Відповідно до того, як difftoolприймає -g/--[no-]guiпараметр, змусити mergetoolприйняти той самий варіант, щоб використовувати merge.guitoolзмінну для пошуку mergetool за замовчуванням замість merge.tool.


5

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

Як використовувати kdiff3 як інструмент diff / merge для 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, як інструмент diff / merge для git в WSL:

  1. Додайте каталог встановлення kdiff3 до шляху Windows.
  2. Додайте TMP до змінної середовища WSLENV Windows (WSLENV = TMP / вище). Директор 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-шлях у windows-шлях при виклику 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.