21

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

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

我正在尝试组合一个包装脚本,我可以用它来用 DiffMerge 替换内置的 git diff。基于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%

我将 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

4 回答 4

15

我在整个互联网上寻找答案。我尝试了上面和其他地方的所有解决方案。我可以让合并部分工作,而不是 diff 部分,反之亦然。所以我最终所做的就是从我在互联网上获得的所有对我有用的信息中拼凑出我自己的简单解决方案。它不需要任何脚本,只需您编辑.gitconfig通常位于以下目录中的脚本C:\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..."
于 2011-05-27T21:30:05.867 回答
9

我刚刚使用 msysgit1.6.2.2 将 Notepad++ 设置为我的外部编辑器时遇到了类似的经历。

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

所以试着输入你的“.bat”(即使它不完全是一个 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

不要担心让所有的 ' \' go ' /':这是由 Git 脚本调用外部 diff 工具完成的。

我没有使用 DiffMerge 对其进行测试,但使用 WinMerge,无论是从 DOS 会话还是 Git Shell 都可以正常工作。

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

(使用 ' -e' 选项,我只需键入 ' ESC' 即可关闭并退出 diff 工具:效果很好!)


替代文字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}" '"$@"'
}

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

现在,关于“意外参数”部分:当我用“ ”而不是“ ”
调用 WinMergeU.exe 时,我确实遇到了同样的错误,所以第一个问题是: 你确定“ ”位不能用作" " 或 " " 或 " " 或 " " ? 这就是 Is 可以从DiffMerge 的 pdf 文档的第 9 章“命令行参数”中看到的内容。 如果不是,我怀疑一些双引号是为了正确分隔不同的参数。就像是:/e /ub-e -ub
/title1-title1-t1--title1--t1

"/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"

应该可以正常工作。

于 2009-04-23T21:49:57.240 回答
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 ;)

于 2009-10-28T19:08:48.263 回答
4

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

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

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

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

于 2009-04-24T05:39:57.640 回答