Meld 的现代版本无法将本地文件夹与远程文件夹(在 /run/user/1000/gvfs/ 中)进行比较 - 我们可以修复它吗?

Meld 的现代版本无法将本地文件夹与远程文件夹(在 /run/user/1000/gvfs/ 中)进行比较 - 我们可以修复它吗?

当我在 Ubuntu MATE 21.10 上使用 Meld 3.20.4-1 时,我无法使用以下步骤比较本地和远程文件夹:

  1. 使用 Caja 连接到某个共享 - 按Ctrl+ L,在地址栏中输入以获取挂载到的文件夹sftp://[email protected]/run/user/1000/gvfs/sftp:host=hostname.local,user=user/

  2. 打开终端并从中运行 Meld 来比较文件夹对:

    meld /run/user/1000/gvfs/sftp:host=hostname.local,user=user/home/user/Desktop ~/Desktop
    

结果我得到了

$ meld /run/user/1000/gvfs/sftp:host=hostname.local,user=user/home/user/Desktop ~/Desktop
Usage:
 meld Start with an empty window
 meld <file|folder> Start a version control comparison
 meld <file> <file> [<file>] Start a 2- or 3-way file comparison
 meld <folder> <folder> [<folder>] Start a 2- or 3-way folder comparison

Error: remote folder “/run/user/1000/gvfs/sftp:host=hostname.local,user=user/home/user/Desktop” not supported

我们能在用户层面解决这个问题吗?

答案1

N0rbert 的解决方法实际上不起作用。因为 Meld 使用 Gnome 的 GIO,它无论如何都会将其检测为“远程文件系统”。基本比较可能有效,但一旦您尝试实际合并内容,就会遇到麻烦。比如删除目录。

如果你强制执行,通过修补 Meld 的检测,就像我在这个测试中所做的那样,它会要求 GIO 删除目录,而 GIO 会失败,因为“目录不为空”。换句话说,删除功能显然只对本地文件系统递归工作。这太疯狂了,因为 Linux 的 VFS 默认不会在文件系统实现之间做出这种区分,而这正是它的全部意义所在。

因此,显然,GIO 不使用那些已经可以正常工作的标准 Linux VFS 接口,而是使用其自己的黑客式且不符合 Linux/Unix 标准的解决方案(部分基于 VFS,但情况更糟)。
作为一名老 Linux 用户,我可以告诉你,这是由于它是由来自 Windows 的开发人员运行的,他们认为一切都必须像 Windows 一样工作,因为他们要么太年轻,要么积极拒绝学习 Unix/Linux 的基本惯例和思想,然后注定要重新发明 Unix……很糟糕。
(容器、systemd 的实现 [不是一般的想法,这很好]、内核的网络接口实现、任何要求“桌面上的 Linux”的人、Steam 在 Linux 上的“实现”方式 [它只是一个自定义 Wine 实例内的 Windows 应用程序,忽略所有 Linux 约定] 等原因相同。)

Meld 本身在源代码中有这样的注释:

# TODO: Deleting remote folders involves reimplementing
# shutil.rmtree for gio, and then calling
# self.recursively_update().

(或者......你知道......就像普通人一样使用标准 VFS/POSIX 接口。)

所以唯一的解决方案是使用适当的 Linux 工具,或者一直运行 Windows/MacOS,而不是在前者上运行想要成为后者的工具。;)

我建议Kdiff3,但这也有它自己的问题,因为它无法将新文件从本地复制到远程,至少在我使用 Android 手机上的 KDEConnect 与 sshfs 进行目录比较的情况下是这样的。

除此之外,rsyncdirdiffvimdiff(或vim扩展DirDiff) 等将是原生且更快的解决方案,但是它们当然不太适合手动目录合并,这就是为什么像我这样的人被迫使用 Meld/Kdiff3。


附录:这是核心错误:

允许递归删除目录 (#2258) · 问题 · GNOME / GLib · GitLab

这表明的另一个问题是,如果远程文件系统有一个“垃圾”,则g_file_trash可以使用,因为这显然以递归方式工作,甚至远程工作。...我仍然不知道为什么他们会主动将一种实现排除在递归删除之外,尽管从用户空间的角度来看,实际上没有什么区别。

答案2

这样的对比确实不成立自 20.04 LTS 起,所以我们需要等待修复上游

临时解决方法是使用SSH文件系统如下:

  1. 通过安装sshfs

    sudo apt-get install sshfs
    
  2. 为远程位置创建临时挂载点

    mkdir ~/sshfs
    sshfs [email protected]:/home/user/Desktop ~/sshfs
    
  3. 使用相同版本的 Meld 将本地文件夹与远程文件夹进行比较

    meld ~/sshfs ~/Desktop
    

    做一些同步。

  4. 卸载远程位置并选择性地删除挂载点

    umount ~/sshfs
    # rmdir ~/sshfs
    

相关内容