Unison начинает синхронизацию с нуля, когда я изменяю родительскую папку.

Вопрос или проблема

Я использую 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, особенно при больших объемах данных и частых изменениях структур каталогов. Однако применять его следует осторожно, чтобы предотвратить непреднамеренные потери данных.

Оцените материал
Добавить комментарий

Капча загружается...