我在Git中使用KDiff3 (可执行kdiff3.exe)作为git difftool,并且在Ubuntu子系统下遇到了使用它的问题。
Ubuntu子系统已经安装了Git。因此,我从Git Bash复制了Git全局配置(相应地更改路径):
[user]
email = ...
name = ...
[merge]
tool = kdiff3
[mergetool "kdiff3"]
path = "/mnt/c/Program Files/KDiff3/kdiff3.exe"
[diff]
tool = kdiff3
guitool = kdiff3
[difftool "kdiff3"]
path = "/mnt/c/Program Files/KDiff3/kdiff3.exe"
[core]
autocrlf = true然后我遇到了一个错误:
Opening of these files failed
- [filename].[extension] (A)程序窗口正确打开,但只显示右侧文件(B)。
这个错误每次都是可重复的。是什么导致了这个错误?
发布于 2021-09-14 06:10:11
今天编辑的一个老问题。现有的答案可能有效,但我也能想到另外两种可能性。
首先,OP使用Windows子系统Linux (WSL)在Windows中运行Ubuntu。他们以前在kdiff3.exe中使用Git,但他们希望将工作流程转换为WSL/Ubuntu中的Linux。
当您在正确的轨道上改变从C:\...到/mnt/c/...的扩散工具的路径时,还有更多的事情要做。因为WSL允许您以这种方式运行Windows可执行文件,所以它实际上是试图运行kdiff3.exe。但是,由于您(当时)使用的是Linux版本的git,所以很自然地使用Linux路径来比较文件。
为了扩展@oikku在另一个答案中说的话,因为kdiff3.exe是一个Windows可执行文件,它只理解Windows结构(即k.a)。C:\...)。当Linux将Linux路径传递给它时,Windows可执行文件(正确地)阻塞了,给出了错误Opening of these files failed。
例如:
# What Windows kdiff3 expected:
kdiff3.exe C:\file1.txt.rev1 C:\file1.txt.rev2
# What Windows kdiff3 got from Linux Git:
kdiff3.exe /mnt/c/file1.txt.rev1 /mnt/c/file1.txt.rev2至少在今天,还有两种可能的解决办法:
kdiff3.exe编写一个包装器脚本,对传递给它的参数进行路径转换。您可以使用默认安装在WSL/Ubuntu中的wslpath命令(至少现在是这样)来执行目录转换。我想不出为什么这是行不通的;您只需要确保将所有可能的参数从包装器脚本以它所期望的形式传递给命令。https://askubuntu.com/questions/1021601
复制相似问题