【问题标题】:Git difftool not launching external DiffMerge programGit difftool 未启动外部 DiffMerge 程序
【发布时间】:2014-06-12 21:58:16
【问题描述】:

我一直在遵循answer 中“blog entry by Dave”链接中的说明,因为我使用的是 Windows 7,并且确实使用了 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 文件以包含diff 和difftool 块(我直接从帖子中复制了这些行,他确实离开了注释掉的#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 应该包含在 git 中,从 1.6.3 版本开始。

当我查看错误中引用的文件的第 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 脚本一无所知,因此按照该帖子中的说明进行操作几乎是我目前知识的局限。

【问题讨论】:

  • 你也安装了 Cygwin 吗?
  • 博文中没有任何内容表明这是必要的。事实上,first comment 似乎表明它不是。
  • 你试过最新的 2.0 msysgit "Git for Windows" 吗? github.com/msysgit/msysgit/releases
  • @VonC - 我们的 git install 中有大量配置;我对尝试在企业安装之外升级它感到紧张。假设该过程应该适用于 1.6.3 以上的任何 git 版本。另外,不确定您在哪里看到 2.0;您提供的链接显示了一个新的(可能不稳定的)1.9.4 预览版。
  • 不要升级。不要碰任何东西。使用可移植的 ditrib (github.com/msysgit/msysgit/releases/download/…),这是一个可以在任何地方解压缩的存档。这样,如果新的 git 没有解决任何问题,您可以回退到当前的 git。

标签: windows git bash diffmerge


【解决方案1】:

我知道这是一个老问题,并且我认识到我的情况可能只是我很笨,但我确实转动了​​我的轮子试图解决这个问题。不过希望以后不会和我犯同样错误的人彻底迷失。


确保项目显示为git diff!

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

执行git reset 允许git difftool 工作。

【讨论】:

  • 非常感谢。我花了一个小时,你帮了我。
【解决方案2】:

其他答案都不适合我。我终于 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 变量在同一个位置。 我将此添加到我的路径中:

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】:

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

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

    由于 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 了解此问题的影响程度。)

    【讨论】:

      【解决方案4】:

      差异合并

      不确定这是否有帮助,但这是我使用 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 甚至早在 G​​it 1.7.x 进行设置,因此请尝试一下,看看它是否有效。

      Beyond Compare 3 Pro 的奖励

      我现在实际上在 Windows 上使用Beyond Compare 3 Pro 进行大部分差异分析,尽管有时我仍会使用 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\""
      

      【讨论】:

      • 谢谢!我将您示例中的 DiffMerge 路径复制到了我的 .gitconfig 文件中(使用斜杠,就像您拥有它们一样)并且它可以工作。那么这是否意味着我不需要博文使用的包装文件?
      • @EmmyS 是正确的,你不需要包装文件......至少据我所知。我从来不需要亲自使用包装文件。
      【解决方案5】:

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

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

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

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

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

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

      完成这些步骤后,您应该可以启动合并工具了。

      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
      

      【讨论】:

      • 我没有使用 cygwin。为什么需要使用cygwin格式?
      • 处理删除或添加文件的脚本给了我这个错误:/mingw64/libexec/git-core/git-mergetool--lib: line 124: changed: MyProject/hello.py: No such file or directory。 git-mergetool--lib 中的第 124 行是一个 eval。有没有办法避免错误信息?否则效果很好。
      【解决方案6】:
      [diff]
          tool = meld
      [difftool]
          prompt = false
      [difftool "meld"]
          cmd = "\"C:\\Program Files (x86)\\Meld\\Meld.exe\" \"$LOCAL\" \"$REMOTE\""
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 2017-01-31
        • 2017-02-14
        • 1970-01-01
        • 2017-05-27
        • 1970-01-01
        相关资源
        最近更新 更多