git difftool 突然停止工作/如何排除故障?
git difftool suddenly stopped working / how to troubleshoot?
我已将 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 答案:
我仔细检查了路径,我也检查了
我的 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
}
根据评论中的讨论,可以通过检查基础知识来对外部工具进行故障排除 - 它是否已配置,如果您自行启动该工具是否正常工作,该工具是否在系统中 path/is git 配置中配置的工具的正确路径。
我找到了答案 -- 问题是误报。抱歉!
发生的事情是我对 git difftool
的确切语义感到困惑。
像git diff
一样,git difftool
显示工作目录和index之间的区别,而不是HEAD .当我 运行 我的命令时,我已经上演了我的更改(即将它们放入索引),所以虽然与 HEAD 有差异 ,但没有差异 来自索引,因此命令的行为是静默的。我应该用来显示差异的命令是 git difftool HEAD
而不仅仅是 git difftool
我想这个故事的寓意是:
如果 git difftool
什么也没显示,则尝试 git diff
。如果是后者
也显示nothings,那么可能没有区别,可能是git difftool
的配置没有问题
我想用下面这张精彩的图来结束这个回答
来自 "A Visual Git Reference" 可以作为一个很好的
提醒 git diff
与 git diff HEAD
的确切语义
我已将 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 答案:
我仔细检查了路径,我也检查了
我的 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
}
根据评论中的讨论,可以通过检查基础知识来对外部工具进行故障排除 - 它是否已配置,如果您自行启动该工具是否正常工作,该工具是否在系统中 path/is git 配置中配置的工具的正确路径。
我找到了答案 -- 问题是误报。抱歉!
发生的事情是我对 git difftool
的确切语义感到困惑。
像git diff
一样,git difftool
显示工作目录和index之间的区别,而不是HEAD .当我 运行 我的命令时,我已经上演了我的更改(即将它们放入索引),所以虽然与 HEAD 有差异 ,但没有差异 来自索引,因此命令的行为是静默的。我应该用来显示差异的命令是 git difftool HEAD
而不仅仅是 git difftool
我想这个故事的寓意是:
如果 git difftool
什么也没显示,则尝试 git diff
。如果是后者
也显示nothings,那么可能没有区别,可能是git difftool
我想用下面这张精彩的图来结束这个回答
来自 "A Visual Git Reference" 可以作为一个很好的
提醒 git diff
与 git diff HEAD