Современные версии Meld не могут сравнивать локальную папку с удаленной папкой (в /run/user/1000/gvfs/) - можно ли это исправить?
Когда я использую Meld 3.20.4-1 в Ubuntu MATE 21.10, я не могу сравнивать локальные и удаленные папки, используя следующие шаги:
Подключиться к какому-нибудь общему ресурсу с Caja - нажать Ctrl+L, ввести
sftp://user@hostname.local
в адресной строке, чтобы смонтировать папку/run/user/1000/gvfs/sftp:host=hostname.local,user=user/
Откройте терминал и запустите из него 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
с
DirDiff
extension) и др. были бы нативными и более быстрыми решениями, но они, конечно, не так удобны для ручного слияния каталогов с ними, поэтому такие люди, как я, вынуждены использовать Meld/Kdiff3.
ДОБАВЛЕНИЕ: Вот основная ошибка:
Разрешить рекурсивное удаление каталога (#2258) · Проблемы · GNOME / GLib · GitLab
Дополнительная проблема, которую это показывает, заключается в том, что если в удаленной файловой системе есть «Корзина»,
g_file_trash
можно использовать, так как это, по-видимому , работает рекурсивно, даже удаленно. … Я до сих пор понятия не имею, почему они активно исключили одну реализацию из рекурсивных удалений, хотя с точки зрения пользовательского пространства буквально нет никакой разницы.
Действительно такое сравнение не работает с 20.04 LTS , так что нужно ждать фикса в апстриме .
Временный обходной путь — использовать SSHFS следующим образом:
Установить
sshfs
пакет поsudo apt-get install sshfs
Создать временную точку монтирования для удаленного расположения
mkdir ~/sshfs sshfs user@hostname.local:/home/user/Desktop ~/sshfs
Сравните локальную папку с удаленной, используя ту же версию Meld
meld ~/sshfs ~/Desktop
Сделайте некоторую синхронизацию.
Размонтировать удаленное местоположение и, при желании, удалить точку монтирования
umount ~/sshfs # rmdir ~/sshfs