2009-04-23 54 views
21

我剛剛開始使用Git並有可能我已經錯過了一些東西很明顯,但在這裏有雲:如何使用msysgit/gitk安裝DiffMerge?

  • 我使用msysgit 1.6.2.2在Windows XP
  • 在安裝時,我選擇了選項1到「只使用Git Bash」

我想把我可以用來替換內置的git diff與DiffMerge的包裝腳本放在一起。基於this thread的SO,我創建了以下批處理文件:

@echo off 
REM ---- Switch forward slashes to back slashes ---- 
set oldW=%2 
set oldW=%oldW:/=\% 
set newW=%5 
set newW=%newW:/=\% 

REM ---- Launch DiffMerge ---- 
"C:/Programs/SourceGear/DiffMerge/DiffMerge.exe" /title1="Old Version" %oldW% /title2="New Version" %newW% 

我劃歸%GIT_INSTALL%/ CMD批處理文件並編輯我的.gitconfig文件,如下所示:

[diff] 
external = C:/Programs/git/cmd/git-diff-wrapper.bat 

如果我啓動Git Bash並執行 git diff HEAD HEAD〜 - myfile

我收到一條消息File (\dev\null) not found - 這給我在Windows上並不奇怪。

按下,我啓動了gitk,然後在編輯>首選項下,我選擇了相同的包裝腳本。嘗試一個特定的文件的「外部差異」選項給出了神祕的錯誤信息Unknown Option "

很明顯,我不知道我在做什麼,所以任何幫助將不勝感激。

+0

剛剛完成我的答案與一些「DiffMerge」的具體內容,如要求。 – VonC 2009-04-24 04:13:04

回答

9

我剛剛經歷了與setting Notepad++ as my external editor with msysgit1.6.2.2有點相似的經歷。

關鍵是要認識到包裝不是DOS腳本,而是一個/ bin/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:/Programs/SourceGear/DiffMerge/DiffMerge.exe" /title1="Old Version" "$2" /title2="New Version" "$5" | cat 

不要擔心使所有的‘\’去'/':它由調用外部diff工具的Git腳本完成。

我沒有用DiffMerge對它進行測試,但使用WinMerge,它在DOS會話或Git Shell中都可以正常工作。

#!/bin/sh 
"C:/Program Files/WinMerge/WinMergeU.exe" -e -ub "$2" "$5" | cat 

(與「-e」選項,我對「ESC」只是OT型關閉並退出比較工具:那偉大工程)


alt textaverage_geek在評論中添加了:

添加'/bin/sh'標題並嘗試再次運行git diff。
這一次的錯誤是:
Unexpected parameter 'C:/Docume~/avggeek/LOCALS~1/Temp/.diff_b08444
有沒有辦法看的,是當我打電話git diff參數獲得通過?

1 /實際上有一種方法可以查看通過什麼參數!
添加以下行的C:\Program Files\Git\libexec\git-core\git-sh-setup文件:

git_editor() { 
    : "${GIT_EDITOR:=$(git config core.editor)}" 
    : "${GIT_EDITOR:=${VISUAL:-${EDITOR}}}" 
    case "$GIT_EDITOR,$TERM" in 
    ,dumb) 
     echo >&2 "No editor specified in GIT_EDITOR, core.editor, VISUAL," 
     echo >&2 "or EDITOR. Tried to fall back to vi but terminal is dumb." 
     echo >&2 "Please set one of these variables to an appropriate" 
     echo >&2 "editor or run $0 with options that will not cause an" 
     echo >&2 "editor to be invoked (e.g., -m or -F for git-commit)." 
     exit 1 
     ;; 
    esac 
#### ADD THIS LINE BELOW 
    echo >&2 "editor is ${GIT_EDITOR:=vi} [email protected]" 
#### END ADDITION ABOVE 
    eval "${GIT_EDITOR:=vi}" '"[email protected]"' 
} 

你會看到被稱爲什麼編輯器,用什麼參數。

現在,關於「意外參數」部分:
我也有同樣的錯誤,當我用「/e /ub」而不是「-e -ub」之稱WinMergeU.exe,所以第一個問題是:
你確定「/title1」位不能用作「-title1」或「-t1」或「--title1」或「--t1」?這是從chapter 9 "Command Lines Arguments" of the pdf documentation of DiffMerge可以看到的。
如果不是,我懷疑一些雙引號是爲了正確分隔不同的參數。喜歡的東西:

"/title1="Old Version"" "$2" "/title2="New Version"" "$5" 
or 
"/title1=\"Old Version\"" "$2" "/title2=\"New Version\"" "$5" 

但我的錢寧願在 「-title1」 或 「-t1」 的形式:

-t1="Old Version" "$2" -t2="New Version" "$5" 

應該只是罰款。

+0

我添加了`/ bin/sh`頭文件,並嘗試再次運行git diff。這一次的錯誤是: 意外的參數'C:/Docume~`/avggeek/LOCALS~1/Temp/.diff_b08444 有沒有辦法看到什麼是我調用`git diff`時通過參數? – 2009-04-24 02:40:57

+0

「關鍵是要認識到包裝不是DOS腳本,而是一個/ bin/sh腳本。」對於像我這樣沒有激活「只使用Git Bash」選項的用戶,它必須是一個Windows腳本(.cmd更時尚......)和你一樣,但是使用%2而不是$ 2 – PhiLho 2012-01-06 06:41:52

4

VonC - 切換到-t1和-t2修正了錯誤。 Diffmerge現在可以用於git bash :)

the gitk patch添加了外部區別支持之後,我意識到它直接調用一個外部區別程序,並將這兩個文件作爲參數。所以我修改gitk>編輯>首選項,直接把下面的命令到外部比較工具選項:

"C:/Programs/SourceGear/DiffMerge/DiffMerge.exe" -t1="Old Version" -t2="New Version" 

現在我已經DiffMerge工作gitk太:-)

+0

真棒,它確實有效!並感謝您對gitk的反饋。 +1 – VonC 2009-04-24 05:53:32

+0

由於最新的Diffmerge路徑更可能是「C:/ Program Files/SourceGear/Common/DiffMerge/sgdm.exe」,-t1/-t2不再起作用。如果你放手,至少可以得到比較窗口 – Ghita 2012-12-08 10:36:27

8

這對我的作品有如下:

~/.gitconfig

[merge] 
tool = diffmerge 
[mergetool "diffmerge"] 
cmd = \"C:/Program Files/git/cmd/git-diffmerge-merge.sh\" \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\" 
trustExitCode = false 

C:\Program Files\Git\cmd\git-diffmerge-merge.sh

信貸的
#!/bin/sh 

localPath="$2" 
basePath="$1" 
remotePath="$3" 
resultPath="$4" 

if [ ! -f $basePath ] 
then 
    basePath="~/diffmerge-empty" 
fi 

"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" --merge --result="$resultPath" "$localPath" "$basePath" "$remotePath" --title1="Mine" --title2="Merged: $4" --title3="Theirs" 

部分去http://therightstuff.de/2009/01/28/Setting-Up-SourceGear-DiffMerge-With-Git.aspx;)

14

我看着所有在互聯網上對這個問題的答案。我嘗試了以上和其他地方的所有解決方案。我可以讓合併部分工作,而不是diff部分,反之亦然。所以我最終做的是將我自己的簡單解決方案從我在互聯網上獲得的所有信息中解析出來。 它不需要任何腳本,只需要編輯通常位於以下目錄中的.gitconfigC:\Documents and Settings\[username]您需要安裝DiffMerge程序。

這是我的.gitconfig文件的相關摘錄。你只需要編輯你的版本DiffMerge的路徑。 注意,我使用舊的DOS 8。在路徑3格式

[diff] 
    tool = diffm 
[difftool "diffm"] 
    cmd = "H:/PROGRA~1/SourceGear/DiffMerge/DiffMerge.exe $LOCAL $REMOTE" 
    prompt = false 

[merge] 
    tool = diffmerge 
[mergetool "diffmerge"] 
    cmd = "H:/PROGRA~1/SourceGear/DiffMerge/DiffMerge.exe --merge --result=$MERGED $LOCAL $BASE $REMOTE" 
    trustExitCode = false 
    keepBackup = false 

您也可以使用命令git config --replace --global [options]如果你願意設置。


這個簡單的解決方案也適用於我。對於較新版本的DiffMerge(3.3.1)中,命令路徑需要改變:

cmd = "C:/PROGRA~1/SourceGear/Common/DiffMerge/sgdm.exe ...etc..." 
相關問題