Вопрос или проблема
Я использую unison для синхронизации двух папок, которые находятся на разных компьютерах (через команду unison с ssh). Если для удобства я меняю название родительской папки, unison начинает синхронизировать папки, как будто это первый раз, когда я их синхронизирую, что занимает много времени (потому что папки довольно большие).
Вот сообщение, которое я получаю:
Ищем изменения
Предупреждение: Архивные файлы не найдены для этих корневых папок, чьи канонические имена:
/path/to/my/folder1
/path/to/my/folder2
Это может произойти либо
потому что это первый раз, когда вы синхронизируете эти корневые папки,
либо потому что вы обновили Unison до новой версии с другим
форматом архива.
Обнаружение обновлений может занять некоторое время в этом запуске, если реплики
большие.
Unison будет считать, что 'последнее синхронизированное состояние' обеих реплик
было полностью пустым. Это означает, что все файлы, которые разные,
будут отмечены как конфликты, а все файлы, которые существуют только на одной
реплике, будут признаны новыми и скопированы в другую реплику.
Если две реплики идентичны, то изменения не будут сообщены.
Есть ли способ сообщить unison, что эти папки были ранее синхронизированы? Возможно, изменив путь где-то и восстановив последний файл unison?
Аналогично, возможно, связанный вопрос: если я копирую одну из своих папок на новый компьютер, и поэтому в тот момент они уже идентичны, могу ли я сказать unison, что они идентичны, чтобы пропустить процесс обнаружения обновлений?
Вы можете (осторожно) использовать опцию rootalias
. Если сделать это неправильно, вы можете полностью поломать зеркало, так что будьте осторожны.
Документация (man unison
) говорит:
rootalias xxx
При расчете имени архивных файлов для данной пары корневых папок,unison
заменяет любые корневые папки, совпадающие с левой стороной любого правилаrootalias
, соответствующей правой стороной.
Что, на мой взгляд, не так хорошо задокументировано, это синтаксис параметра rootalias
xxx
. (Это определено в разделе Спецификация пути, но вы должны знать, чтобы искать там и понимать, что это применимо к rootalias
.)
Пример для вашей ситуации
# Существующая команда (#1)
unison wasSrc remoteHost:dst
# Ваша попытка новой команды (#2)
unison newSrc remoteHost:dst
# Измененная новая команда (#3)
unison -rootalias "//$(hostname)/$PWD/newSrc -> //$(hostname)/$PWD/wasSrc" newSrc remoteHost:dst
После успешного завершения измененной новой команды (#3) вы можете удалить опцию -rootalias
и вернуться к более простой версии (#2).
Примечания
-
Если
wasSrc
иnewSrc
уже являются абсолютными путями, которые начинаются с/
, тогда вы не должны включать$PWD
, а вместо этого использовать этот вариант, который пропускает$PWD
:unison -rootalias "//$(hostname)/newSrc -> //$(hostname)/wasSrc" newSrc remoteHost:dst
-
Если вы не используете
bash
или другой shell, который поддерживает$PWD
, вы можете использовать$(/bin/pwd)
или жестко закодированный абсолютный путь, такой как/home/user/path/to/newSrc
Ответ или решение
Unison — это мощный инструмент для синхронизации файлов и каталогов между двумя или более системами. Чаще всего он используется через SSH для безопасной передачи данных, обеспечивая возможность поддерживать файлы в актуальном состоянии на разных компьютерах. Однако встречаются ситуации, когда Unison начинает синхронизацию "с нуля", что может происходить из-за изменений в структуре каталогов или из-за перемещения файлов. Ваша проблема заключается в том, что изменение названия родительского каталога приводит к необходимости полной пересинхронизации всех данных, несмотря на то, что файлы в двух папках идентичны.
Теория:
Unison использует специальные архивные файлы для отслеживания состояния синхронизируемых файлов. Эти архивы хранятся локально и позволяют программе понять, какие изменения произошли с момента последней синхронизации. Эти архивы базируются на абсолютных путях к корневым каталогам (roots). Если один из этих путей изменяется, Unison будет рассматривать содержимое как новое и начнет процедуру полной пересинхронизации.
Основная причина проблем с синхронизацией заключается в том, что Unison не смог найти соответствующие архивные файлы из-за изменения путей к корневым каталогам. В таком случае программа предполагает, что имеет дело с совершенно новыми данными, и, следовательно, запускает весь процесс синхронизации заново.
Пример:
Предположим, ваш изначальный командный запрос для синхронизации выглядел следующим образом:
unison /path/to/oldFolder remoteHost:/path/to/remoteFolder
После смены имени папки на локальной системе, команда может выглядеть так:
unison /path/to/newFolder remoteHost:/path/to/remoteFolder
Unison воспримет это как работу с двумя новыми корневыми каталогами, не имеющими архивов, связанных с предыдущими синхронизациями. Результатом станет полная пересинхронизация данных.
Применение:
Чтобы избежать этой проблемы, можно использовать параметр -rootalias
. Этот параметр позволяет Unison распознавать измененные пути как старые, тем самым используя существующие архивные файлы. С помощью rootalias
вы можете указать Unison, что новый путь должен восприниматься как старый, например:
unison -rootalias="//$(hostname)/path/to/newFolder -> //$(hostname)/path/to/oldFolder" /path/to/newFolder remoteHost:/path/to/remoteFolder
Этот параметр следует применять осторожно, так как неверное указание путей может привести к нарушениям синхронизации, и даже к потере данных.
При этой конфигурации Unison использует архивы от старого пути и выполняет синхронизацию так, как если бы имена папок не изменялись. После успешного применения этой команды можно возвращаться к использованию стандартной команды без rootalias
, так как архивы уже обновлены:
unison /path/to/newFolder remoteHost:/path/to/remoteFolder
Отмечу, что Unison ожидает, что пути, указанные с rootalias
, уже являются абсолютными. Если это не так, используйте переменные среды, такие как $PWD
для получения текущего каталога, или укажите абсолютный путь вручную. Важно удостовериться, что используемые пути корректны, чтобы избежать возможных проблем с синхронизацией.
Кроме того, если вы копируете папку на новый компьютер, и они уже идентичны, можно использовать тот же подход с rootalias
, чтобы Unison сразу распознал существующие архивы и выполнил процесс sync без проверки идентичности файлов. Это значительно ускорит начальную синхронизацию.
Заключая, данный метод интеграции старых архивов с путем нового каталога может существенно упростить управление синхронизацией в Unison, особенно при больших объемах данных и частых изменениях структур каталогов. Однако применять его следует осторожно, чтобы предотвратить непреднамеренные потери данных.