使用.gitconfig配置差异工具


159

如何配置Git以使用其他工具与.gitconfig文件进行比较?

我的.gitconfig中有这个:

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

这是行不通的; 它只是打开常规命令行差异。当我做

export GIT_EXTERNAL_DIFF=git-chdiff

然后git diff将打开外部差异工具(所以我知道外部差异工具脚本可以正常工作)。diff工具的.gitconfig配置是否出现问题?



Answers:


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会花费更多的工作,请参阅如何使用首选的diff工具/查看器查看“ git diff”输出?


第一个链接断开。似乎域已从更改.com.org。我能够浏览jeetworks.org/software
RBT

1
预先配置的“现成的” difftool是什么意思?要设置不在您列表中的外部差异工具“ winMerge”,我必须做与您在帖子中提到的完全相同的设置,并且一切开始无需任何其他配置即可工作。这是否意味着git也支持“ winMerge”,因为据我从您的帖子中了解到的那样,它需要一些额外的工作/设置/配置来安装一个不被支持的差异工具。由git框。
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
两栖游戏,2014年

也许您具有定义另一个差异工具的本地配置?
Omer Dagan

1
也许您需要传递正确的参数来进行扩散:此链接说明了如何进行融合:链接:nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
rptr 2014年

5
@amphibient:尝试使用git diff 工具 myfile.txt来使用该工具。
JBRWilkinson '16

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


23
最后1%的出价。没有什么比完全锤打的钉子更令人满意了;)
Titou

1
有什么方法可以使其成为默认工具?
math0ne

6
太好了,但是您错过了这一步git config --global --add difftool.prompt false。;)
Suma

36

这是我的〜/ .gitconfig的一部分,在这里我配置了diff和merge工具。我喜欢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”命令。否则,我需要提供可执行文件的完整路径。


在没有所有反斜杠转义的情况下:diffmerge --merge --result="$MERGED" "$LOCAL" "$(if test -f "$BASE"; then echo "$BASE"; else echo "$LOCAL"; fi)" "$REMOTE"
Tim Lovell-

1
我将使用更简单的方法diffmerge --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"
蒂姆·洛弗尔·史密斯

它有一个方便的'sgdm_cygwin.sh'脚本,可以使Cygwin易于使用Windows版本。
thoni56 '16

因此,您可以这样做,ln-s <pathtodiffmerge>/sgdm_cygwin.sh /usr/local/bin/diffmerge并且都准备使用上述配置。以及diffmerge直接从cygwin命令行使用cygwin路径。
thoni56 '16

今天将是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对应于Beyond Compare工具的第3版)。如果要查看所有预定义的键,只需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知道必须从何处启动新工具的exe的路径。这是欺骗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,以免将来对自己造成任何混淆。


16

添加下面的块之一对我来说可以在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

您是否找到一种方法来制作单个跨平台.gitconfig文件,该文件有条件地为linux和Windows指定正确的路径?
杰里·阿舍

1
老实说,我到处都转用融合了,这似乎可行。
moodboom

是否有理由将trustExitCode设置为false?据我了解,如果设置为false,git将忽略您工具中的非零退出代码。因此,如果您的美眉工具git会错误地认为合并成功。但是可能有将其设置为false的原因,请解释。
阿波罗

我相信这trustExitCode = false会导致git询问您合并是否成功,而不是依靠该工具是否以正确或错误的状态退出。
moodboom


0

请参阅Microsoft vscode-tips-and-tricks。只需在终端中运行以下命令:

git config --global merge.tool code

但是首先,您需要code在PATH中添加命令。 在此处输入图片说明


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将在记事本++中打开提交信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.