如何使用msysgit / gitk设置DiffMerge?

时间:2009-04-23 05:40:36

标签: git windows-xp msysgit diffmerge

我刚刚开始使用Git而且我可能错过了一些明显的东西,但这里有:

  • 我在Windows XP上使用msysgit 1.6.2.2
  • 安装时,我选择了选项1“仅使用Git Bash”

我正在尝试整理一个包装脚本,我可以使用它来用DiffMerge替换内置的git diff。根据SO上的this thread,我创建了以下批处理文件:

@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%

我将bat文件放在%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,在Edit> Preferences下,我选择了相同的包装脚本。尝试特定文件的“外部差异”选项会产生含义错误消息Unknown Option "

显然,我不知道我在做什么,所以任何帮助都会非常感激。

4 个答案:

答案 0 :(得分:15)

我在互联网上寻找答案。我尝试了上面和其他地方的所有解决方案。我可以让合并部分工作而不是差异部分,反之亦然。所以我最终做的是将我自己的简单解决方案从我在互联网上获得的所有信息中解放出来。 它不需要您编辑.gitconfig的任何脚本,C:\Documents and Settings\[username]通常位于以下目录中.gitconfig您需要安装DiffMerge程序。

以下是我的DiffMerge文件的相关摘录。您只需编辑[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 版本所在的路径即可。 注意我在路径

中使用了旧的DOS 8.3格式
git config --replace --global [options]

如果您愿意,也可以使用命令 cmd = "C:/PROGRA~1/SourceGear/Common/DiffMerge/sgdm.exe ...etc..." 进行设置。


这个简单的解决方案也适用于我。对于更新版本的DiffMerge(3.3.1),需要更改命令路径:

{{1}}

答案 1 :(得分:9)

我刚刚遇到过与setting Notepad++ as my external editor with msysgit1.6.2.2有点相似的经历。

关键是要意识到包装器不是DOS脚本,而是/ bin / sh脚本。

所以尝试输入你的“.bat”(即使它不是一个蝙蝠脚本,扩展在这里并不重要):

#!/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

不要担心让所有'\'去'/':它是由调用外部差异工具的Git脚本完成的。

我没有用DiffMerge测试它,但是使用WinMerge,它在DOS会话或Git Shell中都可以正常工作。

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

(使用“-e”选项,我只需要在“ESC”上输入即可关闭并退出差异工具:效果很好!)


alt text average_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} $@."
#### END ADDITION ABOVE
    eval "${GIT_EDITOR:=vi}" '"$@"'
}

您将看到使用什么参数调用哪个编辑器。

现在,关于“意外参数”部分:
当我用“/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"

应该可以正常工作。

答案 2 :(得分: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;)

答案 3 :(得分:4)

VonC - 切换到-t1和-t2修复了错误。 Diffmerge现在适用于git bash:)

在添加了外部差异支持的the gitk patch稍微戳了一下后,我意识到它直接用两个文件作为参数调用外部Diff程序。所以我修改了gitk> Edit> Preferences并将以下命令直接放入External Diff Tool选项中:

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

现在我也让DiffMerge为gitk工作:-)