git difftool 突然停止工作/如何排除故障?

标签 git winmerge

我已将我的 git difftool 设置为使用 winmerge。它已经工作了很长一段时间。但是今天突然不行了。 git difftool 曾经在脏文件上一个接一个地调用 winmerge,但现在不是了。该命令只是返回,好像什么也没发生。没有错误信息。

我仔细检查了一下,确实有几个脏文件(如 git status 所示)

关于如何解决问题有什么建议吗?谢谢!

已更新

感谢 fabspro 的建议。我取得了一些进步,但仍然 未能解决问题。

我对 winmerge 作为 difftool 的原始设置是这样的(在我的 ~/.gitconfig 文件中):

[diff]
      tool = winmerge

现在我明白这将指示 git difftool 使用脚本

C:\Program Files\Git\mingw64\libexec\git-core\mergetools

在我的电脑上。我将在下面展示这个脚本的内容。 我相信里面的东西完好无损,因为没有人碰过它,而且 它在今天之前工作。

然后我也尝试直接调用WinMerge,所以我改变了 ~/.gitconfig 中的指令到这个

[diff]
        tool = mywinmerge
[difftool "mywinmerge"]
        cmd = "\"C:/Program Files (x86)/WinMerge/WinMergeU.exe\" \"$LOCAL\" \"$REMOTE\""

这个想法来自这个 SO 答案:https://stackoverflow.com/a/24337687/1168041

我仔细检查了路径,我也检查了 我的 git bash 我 可以直接调用 WinMerge(不带参数 -- 与上面的配置不同)使用此命令:

$ /c/Program\ Files\ \(x86\)/WinMerge/WinMergeU.exe

仍然,我无法让我的 git difftool 命令工作 (昨天还在工作)

还有什么想法吗?谢谢!

附录

我的 C:\Program Files\Git\mingw64\libexec\git-core\mergetools 的内容

diff_cmd () {
        "$merge_tool_path" -u -e "$LOCAL" "$REMOTE"
        return 0
}

merge_cmd () {
        # mergetool.winmerge.trustExitCode is implicitly false.
        # touch $BACKUP so that we can check_unchanged.
        touch "$BACKUP"
        "$merge_tool_path" -u -e -dl Local -dr Remote \
                "$LOCAL" "$REMOTE" "$MERGED"
        check_unchanged
}

translate_merge_tool_path() {
        # Use WinMergeU.exe if it exists in $PATH
        if type -p WinMergeU.exe >/dev/null 2>&1
        then
                printf WinMergeU.exe
                return
        fi

        # Look for WinMergeU.exe in the typical locations
        winmerge_exe="WinMerge/WinMergeU.exe"
        for directory in $(env | grep -Ei '^PROGRAM(FILES(\(X86\))?|W6432)=' |
                cut -d '=' -f 2- | sort -u)
        do
                if test -n "$directory" && test -x "$directory/$winmerge_exe"
                then
                        printf '%s' "$directory/$winmerge_exe"
                        return
                fi
        done

        printf WinMergeU.exe
}

最佳答案

我找到了答案——问题是误报。对不起!

发生的事情是我对 git difftool 的确切语义感到困惑。

git diff 一样,git difftool 显示工作目录和 index 之间的区别,而不是 HEAD .当我运行我的命令时,我已经暂存了我的更改(即将它们放入索引),所以虽然 HEAD 有差异,但索引没有差异>,因此命令的无声行为。我应该用来显示差异的命令是 git difftool HEAD 而不仅仅是 git difftool

我想这个故事的寓意是: 如果 git difftool 没有显示任何内容,请尝试 git diff。如果是后者 也什么都没有显示,那么可能没有区别,可能 git difftool

的配置没有问题

我想用下面这张精彩的图来结束这个回答 来自“A Visual Git Reference”,可以作为一个很好的 提醒 git diffgit diff HEAD

的确切语义

enter image description here

关于git difftool 突然停止工作/如何排除故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46289410/

相关文章:

git - 差异/补丁如何工作以及它们的安全性如何?

git - 在 Visual Studio 2015 中将 WinMerge 设置为差异/merge 工具

python - 使用 emacs/python/winmerge 跨两个 diff 文件映射行号

mercurial - 使用 WinMerge 作为 TortoiseHG merge 工具

Git 在 rebase 时显示旧已解决的提交上的 merge 冲突

Git:有没有办法弄清楚提交是从哪里挑选出来的?

linux - 不能让 git 忽略一个目录

Git - 只推送最近提交到 github

python - 比较两个文件并将报告保存在任何其他文件中

comparison - 仅复制差异(kdiff、winmerge、任何类似工具的差异)