Синхронизация ломает свойства заметки в Obsidian: дубли ключей, пропажа из Dataview, тихие ошибки плагинов
Свойства заметки (frontmatter, Properties) — это YAML-блок в начале файла: tags, status, due, aliases. По ним строятся запросы Dataview, таблицы Bases, шаблоны Templater, фильтры Tasks. Поломка свойств стоит дороже поломки текста: текст видно глазами, а сломанное свойство просто выключает заметку из всех запросов, и никто об этом не сообщает.
Краткий ответ
Свойства ломаются, когда два устройства правят одну заметку независимо, а синхронизатор сливает файл как текст — построчно. У YAML есть правило, которого нет у прозы: имя свойства встречается в блоке один раз. Построчное слияние про это правило не знает и оставляет ключ дважды. Такой файл остаётся валидным YAML, поэтому ничего не выглядит сломанным, а Properties, Dataview и Bases читают только одно из двух значений. Лечится это на уровне синхронизатора: свойства должны сливаться как данные, по именам, а не как строки.
Что именно вы увидите
Ключ встречается дважды. Два устройства добавили одно и то же свойство — каждое принесло свою строку:
---
status: в работе
tags: [проект, обучение]
status: готово
---
Obsidian покажет одно значение, Dataview прочитает другое. Ошибки не будет ни там, ни там.
Заметка пропала из запросов. WHERE status = "готово" перестал её возвращать, хотя в редакторе свойство на месте. Это тот же дубль, только с другой стороны.
Свойства показаны как обычный текст. Если синхронизатор дописал в YAML свою строку — маркер конфликта от Git, дублирующий разделитель ---, обрезанную строку — блок перестаёт быть валидным YAML. Obsidian отрисует его как текст в начале заметки, а вкладка Properties станет пустой.
Плагины считают неправильно. Tasks не видит due, Templater подставляет пустое значение, Bases показывает пустую ячейку. Ни один из них не скажет, что данные повреждены — они получат то, что смог разобрать парсер.
Почему это делает любой построчный merge
Синхронизаторы, которые умеют сливать одновременные правки, работают с файлом как с последовательностью строк или символов. Такое слияние отлично подходит для прозы: две вставки в разные абзацы объединяются без потерь.
Frontmatter живёт по другим правилам. Порядок ключей не несёт смысла, а уникальность имени — несёт. Список tags — это множество, а не строка. Дата в due — значение, а не набор символов. Слияние, которое знает только про строки, обязано либо продублировать ключ, либо выбрать одну версию блока целиком и потерять правку второго устройства.
Что делают конкретные синхронизаторы
Obsidian Sync сливает заметку и в ряде случаев оставляет дубль свойства или создаёт конфликтную копию. Об этом есть развёрнутые обсуждения на официальном форуме: конфликтная копия без независимых правок и автоматическое слияние внешних изменений.
iCloud Drive, Dropbox, Google Drive не сливают ничего. Они создают вторую копию файла: Note (conflicted copy).md. Свойства остаются целыми в обеих копиях, но заметок теперь две, и бэклинки ведут только на одну.
Syncthing делает то же самое под именем .sync-conflict-*.
Obsidian Git пишет в файл маркеры конфликта <<<<<<<, в том числе внутрь YAML-блока. Это самый заметный вариант поломки: Obsidian сразу перестаёт читать свойства.
Remotely Save и подобные плагины поверх облака выбирают одну версию по времени изменения. Правка второго устройства пропадает вместе со свойствами, которые в ней были.
Как починить то, что уже сломалось
- Найдите заметки с дублями. Поиск Obsidian по регулярному выражению работает по всему файлу, поэтому проще начать с проверки конкретных ключей:
/^status:/в поиске покажет вхождения, а заметки с двумя строками видно в превью. - Откройте заметку в режиме исходного кода (
Ctrl/Cmd + E) — вкладка Properties скрывает дубли, а исходник показывает их прямо. - Оставьте одно значение, удалите вторую строку.
- Проверьте, что заметка вернулась в запросы: перестройте индекс Dataview командой
Dataview: Rebuild current viewили перезапустите Obsidian.
Если блок перестал быть валидным YAML, восстановите разделители: ровно три дефиса в первой строке файла и ровно три дефиса на строке, закрывающей блок. Ничего перед первым разделителем быть не должно.
Как не возвращаться к этому
Единственное надёжное решение — синхронизатор, который разбирает свойства и сливает их по именам, а не по строкам.
Rhyolite Sync делает это с версии 3.12.0. При синхронизации frontmatter разбирается в структуру, где у каждого свойства есть имя и значение, и слияние идёт по этим именам: два устройства, добавившие одно свойство одновременно, получают одно свойство с обоими значениями, а не два одинаковых ключа. В заметку это записывается обычным YAML — файл остаётся ровно таким, каким его ожидает увидеть Obsidian и любой плагин.
Оговорка, о которой стоит знать заранее: слияние по именам работает, когда обе стороны на 3.12.0 или новее. Со старой версией на втором устройстве применяется прежнее поведение — свойства при этом не теряются.
Сводно
- Свойства должны переживать одновременную правку — синхронизатор с отдельным слиянием frontmatter, например Rhyolite Sync.
- Свойства правятся только на одном устройстве — подойдёт любой облачный вариант, конфликтные копии будут касаться текста.
- Vault под Git — держите frontmatter вне зоны одновременных правок: маркеры конфликта в YAML ломают заметку сильнее всего.
Сравнение вариантов по критериям — на странице сравнения. Про конфликтные копии в тексте, а не в свойствах — отдельный разбор.