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

git difftool突然停止工作/如何排除故障?,git,winmerge,Git,Winmerge,我已将我的git difftool设置为使用winmerge。它已经工作了很长一段时间了。但今天它突然停止了工作git difftool用于逐个调用脏文件上的winmerge,但不是今天。命令刚刚返回,好像什么也没发生。没有错误消息 我仔细检查了一下,确实有几个脏文件(如git status所示) 有没有关于如何解决问题的建议?谢谢 已更新 谢谢fabspro的建议。我取得了一些进步,但仍然 未能解决该问题 我最初将winmerge设置为difftool(在我的~/.gitconfig文件中):

我已将我的
git difftool
设置为使用
winmerge
。它已经工作了很长一段时间了。但今天它突然停止了工作
git difftool
用于逐个调用脏文件上的
winmerge
,但不是今天。命令刚刚返回,好像什么也没发生。没有错误消息

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

有没有关于如何解决问题的建议?谢谢

已更新

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

我最初将
winmerge
设置为
difftool
(在我的
~/.gitconfig
文件中):

现在我明白了,这将指导
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\""
这个想法来源于这样一个答案:

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

$ /c/Program\ Files\ \(x86\)/WinMerge/WinMergeU.exe
尽管如此,我还是无法让我的
git difftool
命令工作 (昨天还在工作)

还有什么想法吗?谢谢

附录

my
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配置中配置的工具的正确路径。

根据注释中的讨论,对外部工具进行故障排除可以通过检查基本信息来完成-工具是否已配置,如果您自己启动它,工具是否正常工作,工具是否在系统路径中/是否在git配置中配置了正确的工具路径。

我找到了答案--问题是错误警报。对不起

发生的事情是,我被
git difftool
的确切语义弄糊涂了


git diff
类似,
git difftool
显示工作目录和索引之间的差异,而不是标题。当我运行我的命令时,我已经准备好了我的更改(即,将它们放入索引中),因此虽然与头部有差异,但与索引没有差异,因此命令的静默行为。我应该用来显示diff的命令是
git difftool HEAD
而不仅仅是
git difftool

我想这个故事的寓意是: 如果
git difftool
没有显示任何内容,请尝试
git diff
。如果后者 也没有显示任何内容,那么可能没有差异,并且可能没有任何问题,配置
git difftool

我想用下面的精彩图片来总结这个答案 从“”可以作为一个好的 提醒注意
git diff
vs
git diff HEAD

我找到了答案——问题是虚惊一场。对不起

发生的事情是,我被
git difftool
的确切语义弄糊涂了


git diff
类似,
git difftool
显示工作目录和索引之间的差异,而不是标题。当我运行我的命令时,我已经准备好了我的更改(即,将它们放入索引中),因此虽然与头部有差异,但与索引没有差异,因此命令的静默行为。我应该用来显示diff的命令是
git difftool HEAD
而不仅仅是
git difftool

我想这个故事的寓意是: 如果
git difftool
没有显示任何内容,请尝试
git diff
。如果后者 也没有显示任何内容,那么可能没有差异,并且可能没有任何问题,配置
git difftool

我想用下面的精彩图片来总结这个答案 从“”可以作为一个好的 提醒注意
git diff
vs
git diff HEAD


winmerge是否会自动启动?使用您在git配置中配置的命令如何?直接在git bash中运行命令没有启动。错误消息是:
bash:winmerge:command未找到
。但我不记得我更改了任何path环境变量。谢谢顺便说一下,我可以在我的
git bash
:C:\Program Files\git\mingw64\libexec\git core\mergetools的安装目录中找到winmerge的可执行文件。在我的git配置文件中,我刚刚设置了
[diff]tool=winmerge
谢谢!酷,别担心,伙计!如果您自己启动winmerge,它会启动吗?使用您在git配置中配置的命令如何?直接在git bash中运行命令没有启动。错误消息是:
bash:winmerge:command未找到
。但我不记得我更改了任何path环境变量。谢谢顺便说一下,我可以在我的
git bash
:C:\Program Files\git\mingw64\libexec\git core\mergetools的安装目录中找到winmerge的可执行文件。在我的git配置文件中,我刚刚设置了
[diff]tool=winmerge
谢谢!酷,别担心,伙计!谢谢你的建议。我还是被卡住了。我在开始的问题中添加了一些更新的信息。你有更多的想法吗?在我看来,我的
gi
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
}