Ubuntu 子系统上的 Git 和 KDiff3

Ubuntu 子系统上的 Git 和 KDiff3

我用KDiff3(可执行kdiff3.exe)在 Git Bash 中,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)。

每次都会重复出现此错误。什么原因导致此错误?

答案1

问题在于 Git 在这些操作期间会使用临时文件,而临时文件的路径可能是绝对路径。您可以通过将 diff 命令更改为来查看路径echo

[difftool "kdiff3"]
    path = "/mnt/c/Program Files/KDiff3/kdiff3.exe"
    cmd = "echo $LOCAL $REMOTE"

输出结果如下:

/tmp/BPI1A2_Layout.js Layout.js

Windows 中的 KDiff3 可以访问 Layout.js,因为它是相对路径。Windows 上不存在路径 /tmp/BPI1A2_Layout.js,因此 KDiff3 找不到该文件。

您可以使用非默认TMPDIR对于 Git 命令:

TMPDIR=".tmp" git difftool

现在路径将是

.tmp/BPI1A2_Layout.js Layout.js

两者现在都属于 Windows 能够访问的同一目录结构,并且 KDiff3 可以按预期工作。

如果可以使用.tmp目录内的项目文件夹,那么一个简单的解决方法是创建一个别名:

alias git="TMPDIR=.tmp git"

答案2

今天通过编辑解决了一个老问题。现有答案可能有效,但我还能想到另外两种可能性。

需要说明的是,楼主使用的是 Windows Subsystem for Linux (WSL) 来运行 UbuntuWindows。他们之前一直在使用适用于 Windows 的 Git kdiff3.exe,但他们希望将工作流程转换为 WSL/Ubuntu 中的 Linux Git。

虽然你将 difftool 的路径从 改为 是正确的C:\.../mnt/c/...但事情远不止于此。由于 WSL 允许你以这种方式运行 Windows 可执行文件,因此曾是实际上尝试运行kdiff3.exe。但由于您当时使用的是 Linux 版本git,因此它自然会使用 Linux 路径来比较文件。

为了扩展@oikku在另一个答案中所说的内容,因为kdiff3.exe视窗可执行文件,它只理解 Windows 路径结构(又名C:\...)。当 Linux git 向其传递 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传递给它的参数进行路径转换。您可以使用wslpath(至少现在)默认安装在 WSL/Ubuntu 中的命令来执行目录转换。我想不出任何原因为什么这行不通;您只需要确保以期望的​​形式将所有可能的参数从包装器脚本传递给命令。

  • 其次,您可以安装 Linux 版本的 Kdiff3,但请注意它需要 GUI,而 WSL 并不直接支持该 GUI(在回答此问题时)。这意味着您需要在 WSL/Ubuntu 中安装 Windows X 服务器和 X 库。Stack 网站上已经有很多关于此主题的其他问题/答案,因此我在此不再赘述。

    另请注意,Windows 11 将包含 WSLg,这是一项允许您在 WSL 下使用 Linux GUI 应用程序。因此,当该功能可用时,这大概会使操作变得更加容易。

相关内容