如何使用 msysgit / gitk 设置 DiffMerge?

发布于 2024-07-18 00:09:24 字数 1043 浏览 12 评论 0原文

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

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

我正在尝试组合一个包装器脚本,我可以用它来用 DiffMerge 替换内置的 git diff。 基于此线程 ,我创建了以下批处理文件:

@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,并在“编辑”>“首选项”下,选择了相同的包装器脚本。 尝试特定文件的“外部差异”选项会给出神秘的错误消息未知选项“

显然,我不知道我在做什么了,所以任何帮助将不胜感激。

I've just started using Git and it's possible I've missed something obvious, but here goes:

  • I'm using msysgit 1.6.2.2 on Windows XP
  • While installing, I picked option 1 to "Use Git Bash only"

I'm trying to put together a wrapper script that I can use to replace the built in git diff with DiffMerge. Based on this thread on SO, I created the following batch file:

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

I placed the bat file under %GIT_INSTALL%/cmd and edited my .gitconfig file as follows:

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

If i launch Git Bash and execute
git diff HEAD HEAD~ -- myfile

I get a message File (\dev\null) not found - which given I'm on Windows is not surprising.

Pressing on, I launched gitk and under Edit>Preferences, I chose the same wrapper script. Trying the "external diff" option for a particular file gives the cryptic error message Unknown Option "

Clearly, I have no idea what I'm doing anymore so any help would be much appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

失与倦" 2024-07-25 00:09:24

我在互联网上到处寻找这个问题的答案。 我尝试了上面和其他地方的所有解决方案。 我可以让合并部分工作,而不是差异部分,反之亦然。 所以我最终所做的就是根据我在互联网上获得的所有对我有用的信息,拼凑出我自己的简单解决方案
它不需要任何脚本,只需编辑 .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..."

I looked all over the internet for the answer to this. I tried all of the solutions above and elsewhere. I could get the merge part to work and not the diff part or vice versa. So what I did eventually was to hack together my own simple solution from all the info I got on the internet which works for me.
It does not require any scripts only that you edit your .gitconfig which normally resides in the following directory C:\Documents and Settings\[username] You'll need to have DiffMerge program installed already.

Here is relevant extract of my .gitconfig file. You'll just need to edit the path to where your version of of DiffMerge is. Note that I used the old DOS 8.3 format in the path

[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

You can also set it up using the commands git config --replace --global [options] if you so wish.


This simple solution works perfectly for me, too. For more recent versions of DiffMerge (3.3.1), the command path needs to be changed:

    cmd = "C:/PROGRA~1/SourceGear/Common/DiffMerge/sgdm.exe ...etc..."
孤单情人 2024-07-25 00:09:24

我刚刚经历了一些类似的经历 使用 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

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

我没有使用 DiffMerge 对其进行测试,但使用 WinMerge,无论是在 DOS 会话还是在 Git Shell 中,它都工作得很好。

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

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


alt textaverage_geek 在评论中添加:

添加了“/bin/sh”标头并尝试再次运行 git diff。
这次的错误是:
意外参数“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 时,我确实遇到了同样的错误,所以第一个问题是:< br>
您确定“/title1”位不能用作“-title1”或“-t1”或“--title1" 或 "--t1" ? 这就是从 第 9 章“命令”中可以看到的DiffMerge pdf 文档中的“行参数”
如果没有,我怀疑一些双引号是为了正确分隔不同的参数。 例如:

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

应该可以正常工作。

I just experienced a somewhat similar experience with setting Notepad++ as my external editor with msysgit1.6.2.2.

The key was to realize the wrapper was not a DOS script, but a /bin/sh script.

So try to put in your ".bat" (even though it is not exactly a bat script, the extension is not important here):

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

Do not worry about making all the '\' go '/': it is done by the Git scripts calling the external diff tool.

I did not test it with DiffMerge, but with WinMerge, it works just fine, both from a DOS session or a Git Shell.

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

(with the '-e' option, I have just ot type on 'ESC' to close and quit the diff tool: that works great!)


alt textaverage_geek adds in the comments:

added the '/bin/sh' header and tried running git diff again.
This time the error is:
Unexpected parameter 'C:/Docume~/avggeek/LOCALS~1/Temp/.diff_b08444
Is there a way to see what are the parameters getting passed when I call git diff ?

1/ There actually is a way to see what are the parameters getting passed!
Add the following line in the C:\Program Files\Git\libexec\git-core\git-sh-setup file:

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}" '"$@"'
}

You will see what editor is being called, with what parameter.

Now, regarding the "Unexpected parameter" part:
I did have the same kind of error when I called WinMergeU.exe with "/e /ub" instead of "-e -ub", so first question is:
Are you sure that the "/title1" bit could not be used as "-title1" or "-t1" or "--title1" or "--t1" ? That is what Is can see from the chapter 9 "Command Lines Arguments" of the pdf documentation of DiffMerge.
If not, I suspect some double quotes are in order for delimiting properly the different parameters. Something like:

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

But my money would rather be on the "-title1" or "-t1" form:

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

should work just fine.

栖竹 2024-07-25 00:09:24

这对我来说如下:

~/.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/设置-SourceGear-DiffMerge-With-Git.aspx;)

This works for me with as follows:

In ~/.gitconfig:

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

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

Part of the credit goes to http://therightstuff.de/2009/01/28/Setting-Up-SourceGear-DiffMerge-With-Git.aspx ;)

坚持沉默 2024-07-25 00:09:24

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

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

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

现在我也有 DiffMerge 适用于 gitk :-)

VonC - switching to -t1 and -t2 fixed the errors. Diffmerge now works for git bash :)

After a little bit of poking at the gitk patch that added External Diff support, I realized that it's calling an External Diff program directly with the two files as arguments. So I modified gitk>Edit>Preferences and put the following command directly into the External Diff Tool option:

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

Now I have DiffMerge working for gitk too :-)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文