天天看點

如何在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

,終于圓滿成功!