Git difftool没有启动外部DiffMerge程序

时间:2014-06-12 21:58:16

标签: windows git bash diffmerge

我一直在关注" blog entry by Dave"我在Windows 7上链接到此answer并使用SourceGear的DiffMerge工具。我已将git\cmd目录添加到我的PATH系统变量中,并将git-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并按Enter键。什么都没发生。如果我做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脚本一无所知,所以遵循该帖子中的指示几乎是我目前知识的极限。

6 个答案:

答案 0 :(得分:7)

DiffMerge

不确定这是否有帮助,但这是我使用DiffMerge配置的difftool请注意,我使用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中设置了它,所以试试看它是否有效。< / p>

超越比较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\""

答案 1 :(得分:3)

我知道这是一个老问题,我知道我的情况可能只是我愚蠢,但我确实旋转我的车轮试图解决这个问题。但是,希望有一个与我犯同样错误的人将来也不会完全迷失。

确保项目显示为TypeError: '(slice(None, None, None), 1)' is an invalid key

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

允许git difftool允许git reset工作。

答案 2 :(得分:2)

其他答案都不适合我。我终于使用Git 2.6.3,2.7.0

在Windows 7,8,10上工作了

1)确保您可以写入并使用存储在〜/ .gitconfig中的全局.gitconfig,它相对于您的HOME路径。

使用:

git config --global --edit

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

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

2)确保diffmerge在您机器上的PATH变量中。这与HOME变量位于同一位置。 我把它添加到我的路径中:

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的东西,这就是我需要让它工作的全部内容。不需要包装器脚本或本地远程变量。

答案 3 :(得分:2)

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

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

由于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? 

这踢了我的屁股超过一个小时,在此期间我最终得到了这个问题,所以我在这个答案中留下了我的发现,以帮助下一个可能成为这个虫子受害者的可怜的灵魂。 / p>

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

答案 4 :(得分:1)

在我看来,问题是git bash使用的路径不是Windows正在使用的路径。我通过在 git bash 中运行env | grep PATH来检查它。

我知道你不想搞砸git安装,所以我建议你给你的包装器提供完整的路径。

你必须使用cygwin格式给它。怎么做?

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

Step 1

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

Step 2

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

Step 3

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

PS。您可能希望将git-diff-diffmerge-wrapper.sh更改为这些内容,以便处理正确删除/添加的文件,因为它是answer中建议的另一个question

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

答案 5 :(得分:-1)

[diff]
    tool = meld
[difftool]
    prompt = false
[difftool "meld"]
    cmd = "\"C:\\Program Files (x86)\\Meld\\Meld.exe\" \"$LOCAL\" \"$REMOTE\""

添加到以上答案。这是我的Windows的git配置,用于将diff作为差异工具 小心"