天天看点

如何在windows上将git diff配置成使用Beyond Compare

最近由于需要修改一份文档提交到Git服务器上,又不想为了一份文档去安装TortoiseGit客户端,所以就尝试着在Windows上使用Git命令行来操作。

虽然是只需要修改一份文档,但是文档的修改内容还是不少的,这样就导致提交之前查看改动内容(

git diff "filename"

)的时候,很难通过命令行有个明确的对比。

由于之前在使用其他代码管理服务器的时候,都可以配合Beyond Compare(下文简称BC)来使用,于是便想着是不是git-diff也可以指定用BC来查看呢?

本着“内事不决问百度”的想法,先上百度搜索一下。果然很快就找到了一篇文章:Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具 。而且看起来很简单,直接执行

git difftool

命令就可以了。果断照着执行以下试试:

F:\GitHub\markdown [master ≡≡ + ~ - !]> git difftool
/mingw32/libexec/git-core/git-mergetool--lib: line : c:/program files (x86)/microsoft visual studio /common7/ide/devenv.exe: No such file or directory
fatal: external diff died, stopping at filename.txt
           

奇怪了,为什么我的不行呢?而且好像从错误信息看起来,根本就没有用到BC啊。

有错继续问度娘吧!在大概看了一些查询结果之后发现,有一种修改配置文件的方法好像很靠谱。(git difftool 第三方工具配置)

然后照着里面的内容,在配置文件(~/.git/config)中添加了下述内容:

[difftool “bc3”]

cmd = \”C:/Program Files (x86)/Beyond Compare 3/BComp.exe\” \”$LOCAL\” \”$REMOTE\”

当然,添加配置文件的过程也不是那么的简单,这都要归功于万恶的windows、目录名中的空格以及引号需要转义等。在无数次的修改和无数次看到下面的错误信息之后,配置文件中添加的内容总算没错了。

F:\GitHub\markdown [master ≡≡ + ~ - !]> git difftool
fatal: bad config line  in file .git/config
fatal: bad config line  in file .git/config
config --bool --get difftool.trustExitCode: command returned error: 
           

但是,这时候有一个更尴尬的问题出现了——执行

git difftool

命令的时候再次提示最开始的错误。

不是已经在配置文件里面配置过了difftool吗?为什么还是没有调用BC呢?无奈之下,找到了git difftool的官方文档。其中有一段内容引起了我的注意。

Use the diff tool specified by . Valid values include emerge, kompare, meld, and vimdiff. Run git difftool –tool-help for the list of valid settings.

If a diff tool is not specified, git difftool will use the configuration variable diff.tool. If the configuration variable diff.tool is not set, git difftool will pick a suitable default.

果断在本地执行

git config --list

查看所有的配置。

# 以下列出来的只是list的部分内容
diff.tool=vs2013
difftool.prompt=false
difftool.bc4.cmd="c:/program files (x86)/beyond compare 3/bcomp.exe" "$LOCAL" "$REMOTE"
difftool.vs2012.cmd="c:/program files (x86)/microsoft visual studio 11.0/common7/ide/devenv.exe" '//diff' "$LOCAL" "$REMOTE"
difftool.vs2013.cmd="c:/program files (x86)/microsoft visual studio 12.0/common7/ide/devenv.exe" '//diff' "$LOCAL" "$REMOTE"
merge.tool=bc3
mergetool.prompt=false
mergetool.keepbackup=false
mergetool.bc3.cmd="c:/program files (x86)/beyond compare 3/bcomp.exe" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"
mergetool.bc3.trustexitcode=true
difftool.bc3.cmd="C:/Program Files (x86)/Beyond Compare 3/BComp.exe" "$LOCAL" "$REMOTE"
           

第一眼很明显就可以看到

difftool.bc3.cmd="C:/Program Files (x86)/Beyond Compare 3/BComp.exe" "$LOCAL" "$REMOTE"

(毕竟是命令行里面的最后一行)。这不正说明了刚刚的配置没问题吗?但是在仔细看看,就可以发现

diff.tool=vs2013

,再加上

difftool.vs2013.cmd

的配置,也就不难理解为什么最开始执行difftool时候返回的错误信息回合VS有关系了!

既然看到了问题,那么就好解决了!由于默认的配置里面已经指定了

difftool.bc4.cmd

,上面在配置文件中新增的

[difftool "bc3"]

也就可以去掉了,直接加上下面的内容:

[diff]

tool = bc4

最后,再执行一次

git difftool

,终于圆满成功!