Git Diff与超越比较


111

我已经成功使git作为比较工具启动了Beyond Compare 3,但是,当我进行比较时,正在比较的文件没有被加载。仅加载文件的最新版本,而没有其他任何加载,因此“超出比较”的右窗格中没有任何内容。

我正在Beyond Compare 3上与Cygwin一起运行git 1.6.3.1,我已经按照他们在其网站的支持部分中所建议的那样,使用如下脚本来设置超越比较:

#!/bin/sh  
# diff is called by git with 7 parameters:  
# path old-file old-hex old-mode new-file new-hex new-mode  
"path_to_bc3_executable" "$2" "$5" | cat

还有其他人遇到这个问题并知道解决方案吗?

编辑:
我遵循了VonC的建议,但我仍然遇到与以前完全相同的问题。我对Git有点陌生,所以也许我没有正确使用diff。

例如,我正在尝试使用以下命令查看文件上的
差异:git diff main.css

然后,“超出比较”将打开,并且在左窗格中仅显示我当前的main.css,在右窗格中没有任何内容。我希望在左窗格中看到我当前的main.css与HEAD相比,基本上是我上次提交的内容。

我的git-diff-wrapper.sh看起来像这样:

#!/bin/sh  
# diff is called by git with 7 parameters:  
# path old-file old-hex old-mode new-file new-hex new-mode  
"c:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

我的git配置对于Diff如下所示:

[diff]  
external = c:/cygwin/bin/git-diff-wrapper.sh

Answers:


140

我不使用额外的包装.sh文件。我的环境是Windows XP,cygwin上的git 1.7.1和Beyond Compare3。以下是我的.git / config文件。

[diff]
    tool = bc3
[difftool]
    prompt = false
[difftool "bc3"]
    #use cygpath to transform cygwin path $LOCAL (something like /tmp/U5VvP1_abc) to windows path, because bc3 is a windows software
    cmd = \"c:/program files/beyond compare 3/bcomp.exe\" "$(cygpath -w $LOCAL)" "$REMOTE"
[merge]
    tool = bc3
[mergetool]
    prompt = false
[mergetool "bc3"]
    #trustExitCode = true
    cmd = \"c:/program files/beyond compare 3/bcomp.exe\" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"

然后,我使用$ git difftool进行比较,并使用$ git mergetool进行合并。

关于trustExitCode:对于自定义合并命令,请指定是否可以使用merge命令的退出代码来确定合并是否成功。如果未将其设置为true,则将检查合并目标文件时间戳,如果文件已更新,则假定合并成功,否则将提示用户指示合并成功。


12
我正在使用mingw git shell在Windows 7中运行。我必须使用linux样式路径/c/program files而不是c:/program files。我也删除了,"$(cygpath -w $LOCAL)"并使用了"$LOCAL"。这似乎可以解决问题。
兰登·波奇

5
正如@pClass在下面提到的那样,“ bc3”现在是git较新版本中的内部工具。您应该使用唯一的名称,例如“ beyondcompare3”
Scott Wegner

4
GitHub Shell(在Windows 8上)告诉我bcompare: command not found-直到我将工具的名称从更改为其他名称bc3(如abc3)。我想某些Github内部设置会干扰。另外,我删除了该"$(cygpath -w $LOCAL)"部分,并用替换了它"$LOCAL"。现在工作正常。谢谢!
菲利克斯·阿尔卡拉

1
当我看两次提交之间的差异时,这对我来说是个难题。这里是一个更好的解决方案:blog.kifaru.be/2011/07/...
balajimc55

2
我也找到了这篇文章: scootersoftware.com/support.php?
Guy Avraham

28

感谢Posh-Git的作者@dahlbyk,将其配置发布为要点。它帮助我解决了配置问题。

[diff]
    tool = bc3
[difftool]
    prompt = false
[difftool "bc3"]
    cmd = \"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\"
[merge]
    tool = bc3
[mergetool]
    prompt = false
    keepBackup = false
[mergetool "bc3"]
    cmd = \"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\"
    trustExitCode = true
[alias]
    dt = difftool
    mt = mergetool

我尝试了这个答案,但无法区分,也许我做错了。
2012年

1
@Epu您是否确认机器上的路径相同?它是Beyond Compare 3,而不是较旧的v2之类的东西吗?
尼克·约瑟夫斯基2012年

我确认路径相同,并且是bc3。
2012年

1
有趣的是,'git difftool file.txt'和'git mergetool file.txt'可以正常工作,所以我切换到了那些。但是'git diff file.txt'现在已被删除(在用来向我显示默认控制台diff之前)。现在,它给我“错误:无法生成bc3:没有这样的文件或目录\ nexternal diff死亡,在file.txt处停止”
2012年

以防万一有人遇到与我相同的问题(编辑后无法识别的.gitconfig),我必须添加如下路径:cmd = 'C:\\Program Files\\Beyond Compare 4\\BCompare.exe' \"$LOCAL\" \"$REMOTE\"
sebagomez

20

运行这些命令以进行超越比较2:

git config --global diff.tool bc2
git config --global difftool.bc2.cmd "\"c:/program files (x86)/beyond compare 2/bc2.exe\" \"$LOCAL\" \"$REMOTE\""
git config --global difftool.prompt false

运行以下命令以进行超越比较3:

git config --global diff.tool bc3
git config --global difftool.bc3.cmd "\"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\""
git config --global difftool.prompt false

然后使用 git difftool


1
是否支持“超越比较4”?
Danijel

2
@Danijel 在@Daniel Magnussons回答状态中指出的官方文档Note: Use bc3 on the command line for both BC version 3 and 4
BNT


6

这是我的配置文件。进行了一些角力,但现在可以了。我正在使用Windows服务器,msysgit和超越比较3(显然是x86版本)。您会注意到,我不需要指定任何参数,而是使用“ path”而不是“ cmd”。

[user]
        name = PeteW
        email = petew@petew.com
[diff]
        tool = bc3
[difftool]
        prompt = false
[difftool "bc3"]
        path = /c/Program Files (x86)/Beyond Compare 3/BComp.exe
[merge]
        tool = bc3
[mergetool]
        prompt = false
        keepBackup = false
[mergetool "bc3"]
        path = /c/Program Files (x86)/Beyond Compare 3/BComp.exe
        trustExitCode = true
[alias]
        dt = difftool
        mt = mergetool

4

超越比较”支持页面有些简短。

检查我的diff.external答案以获取更多信息(关于确切的语法)

提取:

$ git config --global diff.external <path_to_wrapper_script>

在命令提示符处,替换为“ git-diff-wrapper.sh” 的路径,因此您~/.gitconfig包含

-->8-(snip)--
[diff]
    external = <path_to_wrapper_script>
--8<-(snap)--

确保使用正确的语法指定包装脚本和diff工具的路径,即使用正斜杠代替反斜杠。就我而言

[diff]
    external = c:/Documents and Settings/sschuber/git-diff-wrapper.sh

.gitconfig

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

在包装脚本中。


注意:您也可以使用git difftool



3

请注意,您输入了错误的$ 2路径。因为您位于Cygwin之下,但不属于BC3,因此您应该为其指定完整路径。例如“ d:/ cygwin $ 2”

请在这里参考我的git-diff-wrapper.sh:

$ cat ~/git-diff-wrapper.sh
#!/bin/sh
echo $2
echo $5
/cygdrive/c/Program\ Files\ \(x86\)/Beyond\ Compare\ 3/BCompare.exe "d:/programs/cygwin$2" "$5"

祝好运。


3
您确实应该为此使用cygpath;例如bcompare.exe $(cygpath -w $2)。干杯。
Dan Moulding 2010年

3

如果您运行的是Windows 7(专业版)和Git for Windows(v 2.15或更高版本),则可以简单地运行以下命令来查找Git for Windows支持哪些不同的差异工具。

git difftool --tool-help

您将看到类似于此的输出

git difftool --tool ='可以设置为以下之一:
vimdiff vimdiff2 vimdiff3

这意味着您的git目前不支持(找不到)与difftool相比。

为了使Git能够找到比作有效的difftool以外的其他工具,您应该在系统路径环境变量中具有“ 超越比较”安装目录。您可以通过从shell(cmd,git bash或powershell。我正在使用Git Bash)运行bcompare进行检查。如果Beyond Compare没有启动,请将其安装目录(在我的情况下为C:\ Program Files \ Beyond Compare 4)添加到系统路径变量中。之后,重新启动您的shell。Git将显示Beyond Compare作为difftool选项。您可以使用以下任何命令来启动比difftool更高的比较(例如,将任何本地文件与其他分支进行比较)

git difftool -t bc branchnametocomparewith -- path-to-file
or 
git difftool --tool=bc branchnametocomparewith -- path-to-file

您可以使用以下命令将超越比较配置为默认的difftool

   git config --global diff.tool bc

ps请记住,根据Git能够从您的路径系统变量中找到的内容,上述命令中的bc可以是bc3或bc。


2

BC4 64位的更新:这适用于Windows v.2.16.2和Beyond Compare 4-v.4.2.4(64位版本)的Git

我手动编辑了用户根目录“ C:\ Users \ MyUserName”中的.gitconfig文件,并将diff / difftool和merge / mergetool标记替换为

[diff]
  tool = bc
[difftool "bc"]
  path = 'C:/Program Files/Beyond Compare 4/BComp.exe'
[difftool "bc"]
  cmd = \"C:/Program Files/Beyond Compare 4/BComp.exe\" \"$LOCAL\" \"$REMOTE\"
[difftool]
  prompt = false
[merge]
  tool = bc
[mergetool "bc"]
  path = 'C:/Program Files/Beyond Compare 4/BComp.exe'
[mergetool "bc"]
  cmd = \"C:/Program Files/Beyond Compare 4/BComp.exe\" \"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"


1

区别在于被调用的exe:将其设置为调用bcomp.exe,它将正常工作。配置您的环境以调用bcompare.exe,最后您得到的来自修订系统的比较结果为空。


1

对“超越比较3”运行以下命令(如果您的系统中的BCompare.exe路径不同,请根据您的情况替换它):

git config --global diff.tool bc3
git config --global difftool.bc3.cmd "\"c:/program files (x86)/beyond compare 3/BCompare.exe\" \"$LOCAL\" \"$REMOTE\""
git config --global difftool.prompt false

然后使用 git difftool


1

Windows 10,Git v2.13.2

我的.gitconfig 记住要为'\'和'“'添加转义字符。

[diff]
    tool = bc4
[difftool]
    prompt = false
[difftool "bc4"]
    cmd = \"C:\\Program Files\\Beyond Compare 4\\BCompare.exe\" \"$LOCAL\" \"$REMOTE\"
[merge]
    tool = bc4
[mergetool "bc4"]
    path = C:\\Program Files\\Beyond Compare 4\\BCompare.exe

您可以将difftool以外的设置作为difftool进行引用以使用git命令对其进行配置。


嗨,我有一个类似的脚本,但直到我切换到C:\\ Program Files \\ Beyond Compare 4 \\ BComp.exe,它才失败。使用BCompare.exe可以删除临时文件,然后才能进行比较,因此我只看到了最新文件,没有检入版本。
百利

0

无论出于什么原因,对我来说,由git diff创建的tmp文件在无法比较之前就被删除了。我必须先将其复制到另一个位置。

cp -r $2 "/cygdrive/c/temp$2"
cygstart /cygdrive/c/Program\ Files\ \(x86\)/Beyond\ Compare\ 3/BCompare.exe "C:/temp$2" "$5"


0

对于带有BC2.exe的git版本2.15.1.windows.2。

下面的配置终于可以在我的机器上使用了。

[difftool "bc2"] cmd = \"c:/program files/beyond compare 2/bc2.exe\" ${LOCAL} ${REMOTE}

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.