Современные версии Meld не могут сравнивать локальную папку с удаленной папкой (в /run/user/1000/gvfs/) - можно ли это исправить?

Когда я использую Meld 3.20.4-1 в Ubuntu MATE 21.10, я не могу сравнивать локальные и удаленные папки, используя следующие шаги:

  1. Подключиться к какому-нибудь общему ресурсу с Caja - нажать Ctrl+L, ввести sftp://user@hostname.localв адресной строке, чтобы смонтировать папку /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

Можем ли мы что-то сделать с этой проблемой на уровне пользователя?

2 ответа

Обходной путь от N0rbert на самом деле не работает. Поскольку Meld использует GIO Gnome, который в любом случае определяет его как «удаленную файловую систему». Базовое сравнение может сработать, но вы столкнетесь с проблемами, как только попытаетесь объединить вещи. Например, удаление каталога.

И если вы принудительно исправите обнаружение из Meld, как я сделал для этого теста, он попросит GIO удалить каталог, и GIO выйдет из строя, потому что «каталог не пуст». Другими словами, функция удаления, по-видимому, рекурсивно работает только для локальных файловых систем. Это безумие, поскольку Linux VFS по умолчанию не делает этого различия между реализациями файловой системы, и в этом вся суть.

Таким образом, очевидно, GIO использует не те стандартные интерфейсы Linux VFS, которые уже могли бы работать, а собственное хакерское и ущербное по стандартам Linux/Unix решение (частично поверх VFS, но делающее его хуже).
Как старый пользователь Linux, я могу сказать вам, что это происходит из-за того, что им управляют разработчики, которые пришли из Windows и думают, что все должно работать как Windows, потому что они либо слишком молоды, либо активно отказываются изучать основные соглашения и правила. идеи Unix/Linux, а затем обречены заново изобретать Unix… плохо.
(Та же причина для контейнеров, реализация systemd [не общая идея, что хорошо], реализация сетевого интерфейса ядра, любой, кто просит «Linux на рабочем столе», способ, которым Steam «реализован» в Linux [это просто Приложение Windows внутри пользовательского экземпляра Wine, игнорируя все соглашения Linux] и т. д.)

Сам Meld имеет этот комментарий в исходном коде:

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

(Или… вы знаете… просто используйте стандартный интерфейс VFS/POSIX, как обычные люди.)

Таким образом, единственное решение здесь — использовать подходящие инструменты Linux или пройти весь путь и запустить Windows / MacOS вместо инструмента, работающего на первом, который хочет быть последним. ;)

Я бы порекомендовал Kdiff3 , но у него есть своя проблема, так как он не может копировать новые файлы с локального на удаленный, по крайней мере, в моем случае сравнения каталогов с sshfs из KDEConnect на телефоне Android.

Кроме этого, rsync, dirdiffа также vimdiff(или же vimс DirDiffextension) и др. были бы нативными и более быстрыми решениями, но они, конечно, не так удобны для ручного слияния каталогов с ними, поэтому такие люди, как я, вынуждены использовать Meld/Kdiff3.


ДОБАВЛЕНИЕ: Вот основная ошибка:

Разрешить рекурсивное удаление каталога (#2258) · Проблемы · GNOME / GLib · GitLab

Дополнительная проблема, которую это показывает, заключается в том, что если в удаленной файловой системе есть «Корзина», g_file_trashможно использовать, так как это, по-видимому , работает рекурсивно, даже удаленно. … Я до сих пор понятия не имею, почему они активно исключили одну реализацию из рекурсивных удалений, хотя с точки зрения пользовательского пространства буквально нет никакой разницы.

Действительно такое сравнение не работает с 20.04 LTS , так что нужно ждать фикса в апстриме .

Временный обходной путь — использовать SSHFS следующим образом:

  1. Установить sshfsпакет по

            sudo apt-get install sshfs
    
  2. Создать временную точку монтирования для удаленного расположения

            mkdir ~/sshfs
    sshfs user@hostname.local:/home/user/Desktop ~/sshfs
    
  3. Сравните локальную папку с удаленной, используя ту же версию Meld

            meld ~/sshfs ~/Desktop
    

    Сделайте некоторую синхронизацию.

  4. Размонтировать удаленное местоположение и, при желании, удалить точку монтирования

            umount ~/sshfs
    # rmdir ~/sshfs
    
Другие вопросы по тегам