Конфигурирование diff инструмента с помощью .gitconfig

159

Как настроить Git на использование другого инструмента для сравнения с файлом .gitconfig?

У меня есть это в моем .gitconfig:

[diff]
    tool = git-chdiff #also tried /bin/git-chdiff

Это не работает; он просто открывает обычную командную строку diff. Когда я делаю

export GIT_EXTERNAL_DIFF=git-chdiff

затем git diffоткроется внешний инструмент сравнения (так что я знаю, что сценарий внешнего инструмента сравнения работает нормально). У меня что-то не так с моей конфигурацией .gitconfig для инструмента сравнения?

ryanzec
источник

Ответы:

140

Git предлагает ряд предварительно настроенных difftools «из коробки» (kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse, opendiff, p4merge и araxis), а также позволяет вам указать свой. Чтобы использовать один из предварительно настроенных difftools (например, «vimdiff»), вы добавляете следующие строки ~/.gitconfig:

[diff]
    tool = vimdiff

Теперь вы сможете запустить «git difftool» и использовать свой инструмент по своему выбору.

С другой стороны, для задания собственного difftool требуется немного больше работы, см. Как просмотреть вывод 'git diff' с помощью моего предпочтительного инструмента / средства просмотра diff?

Фредрик Пихл
источник
Первая ссылка не работает. Кажется, домен изменился с .comна .org. Я могу просматривать jeetworks.org/software
RBT
1
Что вы подразумеваете под предварительно сконфигурированным difftool "из коробки"? Чтобы настроить внешний инструмент сравнения "winMerge", которого нет в вашем списке, мне пришлось выполнить те же настройки, которые вы упоминали в своем посте, и все начало работать без какой-либо дополнительной настройки. Значит ли это, что git также поддерживает "winMerge" из коробки, потому что, насколько я понимаю, из вашего поста требуется дополнительная работа / настройки / конфигурация для настройки инструмента сравнения, который не поддерживается вне коробка от мерзавца
RBT
169

Дополнительный способ сделать это (из командной строки):

git config --global diff.tool tkdiff
git config --global merge.tool tkdiff
git config --global --add difftool.prompt false

Первые две строки установят difftool и mergetool в tkdiffсоответствии с вашими предпочтениями. Третья строка отключает надоедливую подсказку, поэтому при каждом git difftoolнажатии она автоматически запускает difftool.

Омер Даган
источник
11
Я сделал, git config --global diff.tool diffmergeно когда я git diff myfile.txtэто сделал, он все еще дал мне стандартную версию unix diff
amphenient
Возможно, у вас есть локальная конфигурация, которая определяет другой инструмент сравнения?
Омер Даган
1
возможно, вам нужно передать правильные параметры для сравнения: эта ссылка объясняет, как это сделать для соединения: ссылка: nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
rptr
5
@amphibient: попробуйте использовать git diff tool myfile.txt.
JBRWilkinson
72

Другие ответили на этот вопрос на 99%, но остался один шаг. (Мой ответ будет исходить из OS X, поэтому вам придется соответствующим образом изменить пути к файлам.)

Вы вносите эти изменения в свой ~/.gitconfig:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = /Applications/Diffmerge.app/Contents/MacOS/diffmerge $LOCAL $REMOTE

Это исправит инструмент сравнения. Вы также можете исправить это, не редактируя ~/.gitconfigнапрямую, введя следующие команды из терминала:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd "/Applications/DiffMerge.appContents/MacOS/diffmerge \$LOCAL \$REMOTE"

1%, о которых все остальные не упомянули, это то, что при использовании этого вы не можете просто бежать git diff myfile.txt; тебе нужно бежать git difftool myfile.txt.

tgoza
источник
23
Проголосовал за этот последний 1%. Нет ничего более удовлетворительного, чем полностью забитый гвоздь;)
Титу
1
Есть ли способ сделать его инструментом по умолчанию?
math0ne
6
Отлично, вы пропустили шаг git config --global --add difftool.prompt false, хотя. ;)
Сума
36

Вот часть моего ~ / .gitconfig, где я настраиваю инструменты сравнения и слияния. Мне нравится diffmerge от SourceGear. (Мне очень очень нравится, на самом деле).

[merge]
        tool = diffmerge
[mergetool "diffmerge"]
        cmd = "diffmerge --merge --result=\"$MERGED\" \"$LOCAL\" \"$(if test -f \"$BASE\"; then echo \"$BASE\"; else echo \"$LOCAL\"; fi)\" \"$REMOTE\""
        trustExitCode = false
[diff]
        tool = diffmerge
[difftool "diffmerge"]
        cmd = diffmerge \"$LOCAL\" \"$REMOTE\"

Итак, вы видите, вы определяете инструмент с именем «diffmerge» в [difftool "diffmerge"]линии. Затем я устанавливаю инструмент "Diffmerge" в качестве значения по умолчанию в [diff] tool =разделе.

У меня, очевидно, есть команда «diffmerge» на моем пути, здесь. В противном случае мне нужно было бы указать полный путь к исполняемому файлу.

Дэн Рэй
источник
Без всякой обратной косой черты:diffmerge --merge --result="$MERGED" "$LOCAL" "$(if test -f "$BASE"; then echo "$BASE"; else echo "$LOCAL"; fi)" "$REMOTE"
Тим Ловелл-Смит
1
Я пойду с более простымdiffmerge --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Тим Ловелл-Смит
И у него есть удобный скрипт 'sgdm_cygwin.sh', чтобы сделать версию Windows простой в использовании из Cygwin.
thoni56
Так что вы можете просто сделать, ln-s <pathtodiffmerge>/sgdm_cygwin.sh /usr/local/bin/diffmergeи все готово для использования конфигурации выше. А также diffmergeнепосредственно из командной строки cygwin с путями cygwin.
thoni56
Было бы в sgdm.exeнастоящее время
KZU
22

Воспроизведение моего ответа из этой темы, который был более специфичен для настройки, чем сравнение, как инструмент сравнения для Git. Все детали, которыми я поделился, одинаково полезны для любого инструмента сравнения в общем, поэтому делитесь им здесь:

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

git config --global diff.tool bc3

Приведенная выше команда создает следующую запись в .gitconfigнайденном в %userprofile%каталоге:

[diff]
    tool = bc3

Затем вы запускаете команду ниже ( Выполнение этой команды является избыточным в данном конкретном случае и требуется только в некоторых специализированных случаях. Вы узнаете об этом в ближайшее время ):

git config --global difftool.bc3.path "c:/program files/beyond compare 3/bcomp.exe"

Команда выше создает следующую запись в .gitconfigфайле:

[difftool "bc3"]
    path = c:/program files/Beyond Compare 3/bcomp.exe

Здесь важно знать ключ bc3. Это хорошо известный ключ для git, соответствующий определенной версии известных инструментов сравнения, доступных на рынке ( bc3соответствует 3-й версии инструмента Beyond Compare). Если вы хотите увидеть все предопределенные ключи, просто запустите git difftool --tool-helpкоманду на git bash. Это возвращает ниже список:

vimdiff
vimdiff2
vimdiff3
araxis
bc
bc3
codecompare
deltawalker
diffmerge
diffuse
ecmerge
emerge
examdiff
gvimdiff
gvimdiff2
gvimdiff3
kdiff3
kompare
meld
opendiff
p4merge
tkdiff
winmerge
xxdiff

Вы можете использовать любой из вышеперечисленных ключей или определить свой собственный ключ. Если вы хотите полностью настроить новый инструмент (или недавно выпущенную версию известного инструмента), который не сопоставляется ни с одним из перечисленных выше ключей, вы можете сопоставить его с любым из перечисленных выше ключей или с новым ваш собственный ключ.

Что делать, если вам нужно настроить инструмент сравнения, который

  • Абсолютно новый на рынке

ИЛИ

  • Выпущена новая версия существующего известного инструмента, который не сопоставлен ни с какими предопределенными ключами в git ?

Как и в моем случае, я установил «вне сравнения 4». «Вне сравнения» - это хорошо известный инструмент для git, но его версия 4 по умолчанию не сопоставлена ​​ни с одним из существующих ключей. Таким образом, вы можете использовать любой из следующих подходов:

  1. Я могу сопоставить инструмент сравнения 4 с уже существующим ключом, bc3который соответствует версии сравнения 3. У меня не было превосходной версии 3 на моем компьютере, поэтому мне было все равно. Если бы я хотел, я мог бы сопоставить его с любым из предварительно определенных ключей в приведенном выше списке, например examdiff.

    Если вы сопоставляете хорошо известную версию инструментов с соответствующим уже существующим / хорошо известным ключом, вам не нужно будет запускать вторую команду, поскольку их путь установки уже известен git .

    Например, если бы я установил версию 3 для сравнения на моем компьютере, то для .gitconfigначала работы было бы достаточно иметь следующую конфигурацию в моем файле:

    [diff]
    tool = bc3
    

    Но если вы хотите изменить связанный с ним инструмент по умолчанию, то в конечном итоге вы упомянете pathатрибут отдельно, чтобы git узнал путь, откуда должен запускаться исполняемый файл вашего нового инструмента. Вот запись, которую лисы запускают за пределами сравнения 4. Обратите внимание на путь exe:

    [difftool "bc3"]
    path = c:/program files/Beyond Compare 4/bcomp.exe
    
  2. Самый чистый подход - полностью определить новый ключ для нового инструмента сравнения или новой версии известного инструмента. Как и в моем случае, я определил новый ключ, bc4чтобы его было легко запомнить. В таком случае вам нужно выполнить всего две команды, но ваша вторая команда не будет устанавливать путь к исполняемому файлу вашего нового инструмента. Вместо этого вы должны установитьcmd атрибут для вашего нового инструмента, как показано ниже:

    git config --global diff.tool bc4
    
    git config --global difftool.bc4.cmd "\"C:\\Program Files\\Beyond Compare 4\\bcomp.exe\" -s \"\$LOCAL\" -d \"\$REMOTE\""
    

    Запуск вышеуказанных команд создает следующие записи в вашем .gitconfigфайле:

    [diff]
    tool = bc4
    [difftool "bc4"]
    cmd = \"C:\\Program Files\\Beyond Compare 4\\bcomp.exe\" -s \"$LOCAL\" -d \"$REMOTE\"
    

Я настоятельно рекомендую вам следовать подходу № 2, чтобы избежать путаницы в будущем.

RBT
источник
16

Добавление одного из блоков ниже помогает мне использовать KDiff3 для моей среды разработки Windows и Linux. Это делает для хорошего последовательного межплатформенного инструмента сравнения и слияния.

Linux

[difftool "kdiff3"]
    path = /usr/bin/kdiff3
    trustExitCode = false
[difftool]
    prompt = false
[diff]
    tool = kdiff3
[mergetool "kdiff3"]
    path = /usr/bin/kdiff3
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = kdiff3

Windows

[difftool "kdiff3"]
    path = C:/Progra~1/KDiff3/kdiff3.exe
    trustExitCode = false
[difftool]
    prompt = false
[diff]
    tool = kdiff3
[mergetool "kdiff3"]
    path = C:/Progra~1/KDiff3/kdiff3.exe
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = kdiff3
moodboom
источник
Вы нашли способ создать один кросс-платформенный файл .gitconfig, в котором условно указаны правильные пути для Linux и Windows?
Джерри Ашер
1
Честно говоря, я везде переключился на слияние, и, похоже, это работает.
настроение
Есть ли причина для установки trustExitCode = false? Насколько я понимаю, если установлено значение false, git будет игнорировать ненулевой код выхода из вашего инструмента. Так что если ваш инструмент git по ошибке подумает, что слияние прошло успешно. Но, может быть, есть причина для установки этого фальшивки, пожалуйста, объясните.
аполлон
Я верю trustExitCode = false, что git спросит вас, было ли слияние успешным, а не полагается на то, что инструмент завершил работу с истинным или ложным статусом.
moodboom
4

Если вы хотите использовать несколько инструментов сравнения, добавьте псевдоним в .gitconfig

[alias]
    kdiff = difftool --tool kdiff3
Александр Кац
источник
чтобы упомянуть --toolвариант. Спасибо
itMaxence
0

Обратитесь к Microsoft vscode-tips-and-tricks . Просто запустите эти команды в вашем терминале:

git config --global merge.tool code

Но сначала вам нужно добавить codeкоманду в ваш путь. введите описание изображения здесь

sudoz
источник
0

В Windows нам нужно запустить $git difftool --tool-helpкоманду, чтобы увидеть различные параметры, такие как:

    'git difftool --tool=<tool>' may be set to one of the following:
                    vimdiff
                    vimdiff2
                    vimdiff3

    The following tools are valid, but not currently available:
                    araxis
                    bc
                    bc3
                    codecompare
                    deltawalker
                    diffmerge
                    diffuse
                    ecmerge
                    emerge
                    examdiff
                    gvimdiff
                    gvimdiff2
                    gvimdiff3
                    kdiff3
                    kompare
                    meld
                    opendiff
                    p4merge
                    tkdiff
                    winmerge
                    xxdiff
Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.

и мы можем добавить любой из них (например, Winmerge), как

$  git difftool --tool=winmerge

Для настройки notepad ++ для просмотра файлов перед фиксацией:

 git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

и использование $ git commitоткроет информацию о коммите в notepad ++

Гоял Вики
источник