11

由于我在 Windows 7 上并且确实使用了 SourceGear 的 DiffMerge 工具,因此我一直在遵循此答案中“ Dave 的博客条目”链接中的指示。我已将目录添加到我的 PATH 系统变量并将我的文件放在那里:git\cmdgit-diff-diffmerge-wrapper.sh

#!/bin/sh
"C:\Program Files\SourceGear\Common\DiffMerge\sgdm.exe" "$1" "$2" | cat

(是的,这是 DiffMerge 的正确路径。)

我已经编辑了我的.gitconfig文件以包含diffdifftool块(我直接从帖子中复制了这些行,他确实留在了注释掉的#external行中。我将此添加到我的文件末尾;可以吗?)

[diff]
    # external = git-diff-wrapper.sh
    tool = diffmerge
[difftool "diffmerge"]
    cmd = git-diff-diffmerge-wrapper.sh "$LOCAL" "$REMOTE"

所以我去做,git bash然后按git difftool HEAD~ 67b8679 -- js/site/pizzabuilder.js回车。什么都没发生。如果我这样做git difftool HEAD~ 67b8679,离开我想要的文件,我会得到这个:

Viewing: 'js/angular/hutlovers/hutlovers.js'
Launch 'diffmerge' [Y/n]: Y
C:\Program Files (x86)\Git/libexec/git-core/mergetools/defaults: line 17: git-diff-diffmerge-wrapper.sh: command not found

Viewing: 'js/angular/localization/StoreListCtrl.js'
Launch 'diffmerge' [Y/n]: n

Viewing: 'js/pizzahut/site/browser_version.js'
Launch 'diffmerge' [Y/n]: n

Viewing: 'js/pizzahut/site/dashboard.js'
Launch 'diffmerge' [Y/n]: n

它继续处理提交之间不同的所有文件,但它从不启动 DiffMerge。我不知道如何解释错误;什么命令没有找到?difftool? 我在 git 中运行 1.7.11,difftool据说从 1.6.3 版开始包含在 git 中。

当我查看错误中引用的文件的第 17 行时,这就是那里的内容:

( eval $merge_tool_cmd )

作为此块的一部分:

diff_cmd () {
    merge_tool_cmd="$(get_merge_tool_cmd "$1")"
    if test -z "$merge_tool_cmd"
    then
        status=1
        break
    fi
    ( eval $merge_tool_cmd )
    status=$?
    return $status
}

谁能帮我吗?我是 的日常用户git,但几乎不是超级用户,而且我对 Windows shell 脚本一无所知,所以按照那篇文章中的说明进行操作几乎是我目前知识的局限。

4

6 回答 6

8

我知道这是一个老问题,我承认我的情况可能只是我很笨,但我确实转动了​​我的轮子试图解决这个问题。不过,希望与我犯同样错误的人将来不会完全迷失。


确保项目显示为git diff!

我有一个非常简单的一行更改。做了一个git add .然后被打断了。回来完成并决定仔细检查差异。我没有意识到做 agit add会阻止我使用git difftool.

git reset允许git difftool的工作。

于 2018-05-29T21:32:42.063 回答
7

差异合并

不确定这是否有帮助,但这是我对difftoolDiffMerge 的配置。请注意,我使用的是 msysgit Bash(不确定 Cygwin 或 PoshGit 用户是否会有所不同):

[diff]
    tool = dm
[difftool "dm"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"

我目前正在使用 Git 2.0,但我似乎记得曾使用 Git 1.8.x 或什至早于 Git 1.7.x 进行设置,所以试试看它是否有效。

Beyond Compare 3 Pro 的奖励

实际上,我现在使用Beyond Compare 3 Pro在 Windows 上进行了大部分比较,尽管有时我仍会使用 DiffMerge。difftool如果您想进行切换,这是我的所有设置:

[merge]
    tool = bc3
[diff]
    tool = bc3
[difftool "dm"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"
[difftool "bc3"]
    cmd = "\"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\""
[mergetool "bc3"]
    cmd = "\"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\""
于 2014-06-21T02:18:21.113 回答
3

其他答案都不适合我。我终于 diffmerge 使用 Git 2.6.3、2.7.0 在 Windows 7、8、10 上工作

1) 确保您可以写入和使用存储在 ~/.gitconfig 中的全局 .gitconfig,它与您的 HOME 路径相关。

利用:

git config --global --edit

或者只是导航到 Windows 资源管理器中的文件并以这种方式进行编辑。

可以通过导航到 windows 中的环境变量来设置 HOME 变量(对于 7,右键单击计算机-->属性-->高级系统设置-->环境变量)。

2) 确保 diffmerge 在您机器上的 PATH 变量中。这与 HOME 变量在同一个位置。我将此添加到我的 PATH 中:

C:\Program Files\SourceGear\Common\DiffMerge;

3) 要使 diffmerge 成为默认值,请将以下内容添加到您的全局 .gitconfig 文件中:

[merge]
    tool = diffmerge
[mergetool]
    prompt = true
[mergetool "diffmerge"]
    path = C:\\Program Files\\SourceGear\\Common\\DiffMerge\\sgdm.exe

'\' 是转义字符

重复 difftool 的东西,这就是我让它工作所需要的。不需要包装脚本或本地远程变量。

于 2016-01-07T22:27:52.737 回答
3

SourceTree 用户:这可能是您的问题。

SourceTree 用户遇到此问题中描述的问题的一种可能性:如果您在 SourceTree 中右键单击并启动外部合并工具(内部git mergetool sourcetree运行类似当您解决文件的一侧已被删除的冲突时挂起。

由于 SourceTree 的 UI 没有明确指出冲突的原因是文件在一侧或另一侧被删除,这使情况变得更加复杂。

您可以通过打开终端并运行来确认这一点:

git mergetool

您将看到类似以下内容:

Deleted merge conflict for 'Stuff/Other/Thingamajig.js':
  {local}: modified file
  {remote}: deleted
Use (m)odified or (d)eleted file, or (a)bort? 

这让我的屁股踢了一个多小时,在此期间我结束了这个 SO 问题,所以我将我的发现留在这个答案中,以帮助下一个可能成为这个错误受害者的可怜的灵魂。

(如果您确实遇到此问题,请考虑点击上面的链接并对 SourceTree 错误进行投票,以便 Atlassian 了解此问题的影响程度。)

于 2018-06-12T03:26:08.613 回答
1

在我看来,问题在于 git bash 使用的路径不是 Windows 使用的路径。我通过env | grep PATHgit bash中运行来检查这一点。

我知道您不想弄乱 git 安装,所以我建议您提供包装器的完整路径。

您必须使用 cygwin 格式提供它。怎么做?

1) 到你有包装器的地方,在那里运行Git Bash

步骤1

2) 在Git Bash窗口中输入pwd,这将显示您当前的工作目录。右键单击窗口标题并选择标记。使用鼠标选择路径(在我的情况下它是/C/Users/lpiepiora/cmds并点击Enter.

第2步

3)现在编辑您的.gitconfig并将复制的路径添加到它(您必须在复制路径的末尾添加一个额外的斜杠)。

第 3 步

完成这些步骤后,您应该能够启动合并工具。

PS。您可能希望git-diff-diffmerge-wrapper.sh按照这些思路更改您的内容,以处理正确删除/添加的文件,正如另一个问题的答案中所建议的那样。

#!/bin/sh
NULL="/dev/null"
if [ "$2" = "$NULL" ] ; then
    echo "removed: $1"
elif [ "$1" = "$NULL" ] ; then
    echo "added: $2"
else
    echo "changed: $3"
    "C:\Program Files\SourceGear\Common\DiffMerge\sgdm.exe" "$1" "$2" | cat
fi
于 2014-06-20T21:52:59.320 回答
-1
[diff]
    tool = meld
[difftool]
    prompt = false
[difftool "meld"]
    cmd = "\"C:\\Program Files (x86)\\Meld\\Meld.exe\" \"$LOCAL\" \"$REMOTE\""

添加到上述答案。这是我的 git config for windows 用于将 meld 作为 diff 工具小心使用"

于 2020-03-25T18:39:43.593 回答