![Как игнорировать все файлы, кроме подкаталогов, с помощью Unison?](https://rvso.com/image/1568326/%D0%9A%D0%B0%D0%BA%20%D0%B8%D0%B3%D0%BD%D0%BE%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B2%D1%81%D0%B5%20%D1%84%D0%B0%D0%B9%D0%BB%D1%8B%2C%20%D0%BA%D1%80%D0%BE%D0%BC%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2%2C%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Unison%3F.png)
Я хочу синхронизировать содержимое всех подкаталогов заданного корня, но только несколько файлов в самом корне. Чтобы сделать это, я хотел бы игнорировать все файлы с помощью директивы ignore
(сохраняя все подкаталоги) и повторно добавлять несколько файлов, которые я хочу сохранить с помощью директивы ignorenot
. Чтобы сделать это, я попробовал следующие две вещи:
Добавление регулярного выражения для исключения любой записи в корне, содержащей слеш, путем добавления
ignore = Regex ^(?!.*\/).*$
в мой профиль. Но это приводит к следующему сообщению об ошибке без дальнейших объяснений:Malformed pattern "Regex ^(?!.*\/).*$"."
Сначала все игнорируется с помощью ,
ignore = Name ?*
а затем повторно добавляется каждый путь, содержащий слеш, с помощьюignorenot = Path */*
, что не сработало так, как ожидалось, поскольку неигнорирование каталогов таким образом не работает.
Кажется, это очень простая проблема, но я не могу ее решить.
решение1
Похоже, что невозможно сделать именно то, что вы хотите. Когда Unison синхронизирует файл с каталогом, Unison может отличить их друг от друга, но Unison не ссылается на них по-разному (например, добавляя префикс a /
к каталогам или что-то в этом роде) таким образом, чтобы пользователь мог сопоставлять их по шаблону с одним или другим. Например, если вы синхронизируете каталог с именем deer
и файл с именем phil
в корне ROOT
, Unison видит их имена как
new dir ----> ROOT/deer
new file ----> ROOT/phil
Вы не можете различить ROOT/deer
и ROOT/phil
. Вот несколько предложений
Вручную укажите каталоги, которые вы хотите синхронизировать, добавив строку
path = deer
в свой профиль для каждого каталога. Я думаю, что это стандартный способ настройки Unison в любом случае. Затем для любых файлов в вашем корневом каталоге, которые вы также хотите синхронизировать, скажем, файл с именемphil
, вы можете переместитьphil
в каталог, который синхронизируется, например,deer/synced-root-files/
и затем добавитьсимволическая ссылкаиз этого файла обратно в корневой каталогcd ROOT; ln -s ROOT/deer/synced-root-files/phil
Придумайте соглашение об именовании в вашем корневом каталоге, с которым вы можете сопоставлять шаблоны. Например, назовите все и только те файлы, которые вынехотите синхронизировать что-то вроде
ignore.phil
и добавить строку в свой профиль Unisonignore = Path ignore.*
.
Вот ссылка наСпецификация путииИгнорирование путейразделы руководства Unison, чтобы будущие читатели могли легко его найти.