使用.gitconfig配置diff工具

如何配置Git以使用不同的工具来区分.gitconfig文件?

我在我的.gitconfig中有这个:

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

它不起作用;它只是打开常规命令行差异。当我这样做

export GIT_EXTERNAL_DIFF=git-chdiff

然后git diff将打开外部差异工具(所以我知道外部差异工具脚本工作良好)。我对diff工具的.gitconfig配置有问题吗?

273971 次浏览

Git提供了一系列预配置的“开箱即用”的difftools (kdiff3、kompare、tkdiff、meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge、diffuse、opendiff、p4merge和araxis),还允许您指定自己的difftools。要使用一个预先配置的difftools(例如,"vimdiff"),您可以在~/.gitconfig中添加以下行:

[diff]
tool = vimdiff

现在,您将能够运行“git difftool”并使用您选择的工具。

另一方面,指定你自己的difftool需要更多的工作,参见如何查看'git diff'输出与我喜欢的差异工具/查看器?

这是我的~/的一部分。gitconfig,我配置差异和合并工具。我喜欢SourceGear的diffmerge。(事实上,我非常非常喜欢它)。

[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\"

所以,你看,你在[difftool "diffmerge"]行中定义了一个名为“diffmerge”的工具。然后我在[diff] tool =部分中将工具“diffmerge”设置为默认值。

很明显,我的路径中有diffmerge命令。否则,我需要给出可执行文件的完整路径。

另一种方法(从命令行):

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。

添加下面的一个块可以让我在Windows和Linux开发环境中使用KDiff3。这是一个很好的一致的跨平台差异和合并工具。

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

窗户

[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

其他人已经给出了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

问题中复制我的答案,这更具体到将无以伦比设置为Git的diff工具。我所分享的所有细节在一般情况下对任何diff工具都同样有用,所以我在这里分享。

我们运行的第一个命令如下所示:

git config --global diff.tool bc3

上面的命令在% userprofile %目录下的.gitconfig文件中创建以下条目:

[diff]
tool = bc3

% userprofile %是一个环境变量,你可以在运行提示符下输入它,然后点击输入打开.gitconfig文件所在的目录位置。

就是这样。这就是你所需要的,同时设置一个已经发布的Git已经知道的比较工具的版本,就像在这个例子中,Git已经知道Beyond Compare的第三个版本。

现在让我们来深潜吧!

此外,你可能还需要运行下面的命令:

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

执行该命令的是可选。只有在某些特殊情况下才需要它。我们很快就会知道它的原因。

这里要知道的最重要的是是键bc3。这是Git的一个众所周知的键,它映射到市场上可用的特定比较工具的特定版本,例如,在这种情况下,bc3对应于无以伦比工具的第三个版本。如果你想查看Git维护的完整键列表,请在Git Bash命令行上运行以下命令:

git difftool --tool-help

当我们运行上面的命令时,它会返回下面的列表:

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设置比较工具时,我们可以根据工具及其版本使用上述任何已存在的键,例如,对于Beyond Compare v1,我们将使用键公元前,对于Beyond Compare v3,我们将使用键bc3

但在某些情况下,我们可能需要定义一个自己的全新键,例如,假设我们正在建立一个刚刚发布到市场的全新比较工具。由于显而易见的原因,安装在您机器上的当前版本的Git将不会显示与此新工具对应的任何密钥。Git最终会在未来的版本中显示它,但不会立即显示。同样,这个问题也可能发生在现有工具的新发布版本上,例如上面的列表中没有Beyond Compare v4的键。因此,您总是可以自由地将任何工具映射到任何预先存在的键或您自己的自定义键。

现在让我们来理解下面的场景,同时设置一个比较工具:

  • 一个旧工具的新版本已经发布,它没有映射到Git中的任何预定义键吗?

  • 绝对是全新的市场

就像在我的例子中,我安装了Beyond Compare v4。Git已经知道Beyond Compare工具,但是它的版本4没有映射到任何现有的键。所以我们可以采用以下任何一种方法:

  1. 由于Git中不存在Beyond Compare v4的键,所以我们可以将它映射到已经存在的键bc3,即使它应该映射到Beyond Compare v3。我们可以比Git聪明,从而节省一些精力。

    这就是我们在第一段中没有回答的问题的答案 -如果你将任何工具映射到Git已经知道的键,那么你将需要运行第二个命令。这是因为Git已经知道该工具的EXE位置。

    但请记住,只有当工具的EXE位置在不同版本之间没有变化时,这才会工作。如果Beyond Compare v3和v4在%programfiles%目录中有不同的安装位置,则必须运行第二个命令。

    例如,如果我在我的盒子上安装了Beyond Compare v3,那么在我的.gitconfig文件中有以下配置就足以完成设置过程。这是基于v3和v4具有相同安装路径的假设。

    [diff]
    tool = bc3
    

    但是如果我们想关联非默认工具,那么我们需要单独提到路径属性,这样Git就会知道EXE的路径,它必须从哪里启动。下面的条目告诉Git启动Beyond Compare v4。注意EXE的路径:

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

    此外,如果我们愿意,我们也可以将Beyond Compare v4映射到其他工具的预定义键的任何,例如examdiff。get不会阻止你做这件坏事的。虽然我们应该这样做,以避免维护的噩梦。

  2. < p > 最简洁的方法是定义一个自定义键。我们可以为任何新的比较工具或旧工具的新版本定义一个全新的键。就像在我的例子中,我定义了一个新键bc4,因为它相当直观。我可以把它命名为foobaar

    现在,当密钥完全是新的时,设置过程略有不同。在这种情况下,您总共必须运行两个命令。但是我们的第二个命令不会设置新工具的EXE路径。相反,我们必须为新工具设置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,以避免将来出现任何维护问题。

如果你想有一个选项来使用多个diff工具,给文件.gitconfig添加一个别名:

[alias]
kdiff = difftool --tool kdiff3

参考Microsoft的VS代码提示和技巧。 在您的终端上运行这些命令:

git config --global merge.tool code

但是首先你需要在PATH环境变量中添加code命令。

Enter image description here

在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++中打开提交信息。

在前面的回答中,几乎所有的解决方案都不能在Git版本2中使用

我的:Git版本= 2.28.0

difftool的解:Git配置——global diff.tool vimdiff

有了它,你就可以毫无问题地使用它了。