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

时间:2017-09-18 23:10:19

标签: 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\""

这个想法来自这个答案: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
}

2 个答案:

答案 0 :(得分:7)

我找到了答案 - 问题是误报。遗憾!

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

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

我猜这个故事的寓意是这样的: 如果git difftool显示无效,请尝试git diff。如果是后者 也表示没有,然后可能没有差异,git difftool

的配置可能没有任何问题

我想用以下精彩图片来总结这个答案 来自“A Visual Git Reference”,可以作为一种善 提醒git diff vs git diff HEAD

的确切语义

enter image description here

答案 1 :(得分:1)

根据评论中的讨论,可以通过检查基础知识来完成对外部工具的故障排除 - 是否已配置,如果您自己启动工具,该工具是否正常工作,是系统路径中的工具/是正确的路径到git config中配置的工具。