cygwin下配置git-difftool

beyond compare3比较功能很好用,如何将bc3配置成git difftool,使得用git difftool可以通过bc3的选项卡同时打开两个版本所有不同文件。以下是我的配置过程。 在~/.gitconfig中配置如下

1
2
3
4
5
6
[diff]
	tool = jellybc3
[difftool]
	prompt = false
[difftool "jellybc3"]
	cmd = \"/cygdrive/c/program files/beyond compare 3/bcomp.exe\" \"$(cygpath -w $LOCAL)\" \"$REMOTE\"

以上配置网上都能找到,最后一行命令是打开bc3并传递两个待比较文件的地址。

实际使用过程中有如下问题:

  1. 路径出错,cygpath -w $LOCAL 并未执行
  2. 执行git difftool命令过程是比较两个git版本库异同,git会对每一对待比较文件调用一次cmd命令,将每一对待比较文件的地址$LOCAL和$REMOTE传递给bc3,命令执行完毕后删除这两个临时文件(如果两个都是临时文件的话),再进行下一次的cmd调用。这样会造成比较时无法用bc3观看两个版本库所有文件的不同,而只能一对对文件看,看完一个关闭这个才能看下个。

解决方法: 使用脚本解决,cmd可以换成自己的脚本,这样就能自定义控制比较过程,处理路径问题了。 将上文配置的cmd一行改为:

1
cmd = git-diff-tool.sh \"LOCAL\"  \"REMOTE\"

脚本代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/bash
#this script is a hook for git difftool, the configuration is in the ~/.gitconfig

echo "$1 : the local path"
echo "$2 : the remote path"

old_path="/git_tmp/old/`basename $1`"
new_path="/git_tmp/new/`basename $2`"

cp -vrf $1 $old_path
cp -vrf $2 $new_path

old_path="d:/program/cygwin0826$old_path"
new_path="d:/program/cygwin0826$new_path"

"/cygdrive/C/Program Files/Beyond Compare 3/BCompare.exe" "$old_path" "$new_path" &

脚本将生成的临时文件拷贝至git_tmp目录,临时文件在git调用下一次cmd前被git删除但是已被拷贝至新文件夹,随后开始用bc3进行diff比较,这样每一对文件都能出现在bc3的选项卡中,就能看到两个版本所有文件的不同了。

副作用就是git_tmp文件夹文件会越来越多,需要手动清除,如果git difftool能像awk一样能设置开始动作和结束动作就好了,但是官方文档中没有查到这个功能。

当然不要忘记bc3要设置成选项卡模式,脚本git-diff-tool.sh要设环境变量或者加绝对路径。

git官方文档地址: http://www.kernel.org/pub/software/scm/git/docs/git-difftool.html