Каждая платформа документации со страницей интеграции с git даёт одно и то же обещание: ваша документация живёт в git, команда редактирует в браузере, и всё остаётся синхронизированным. На практике большинство этих интеграций — односторонние зеркала, которые разваливаются, как только два человека вносят правки с разных сторон.
Мы написали о том, почему это происходит, в предыдущей статье. Эта идёт глубже в решение: как Valoryx реализует двунаправленную синхронизацию с использованием паттерна Content Ledger и почему этот подход справляется со сценариями, которые ломают другие инструменты.
Основная проблема
Веб-редактор и git-репозиторий имеют фундаментально разные модели согласованности.
В веб-редакторе сохранение происходит мгновенно и атомарно. Вы нажимаете «сохранить», контент сохраняется, и любой, загружающий страницу, видит вашу версию. Нет понятия «staging» или «commit» — запись и есть публикация.
В git изменения группируются в коммиты, коммиты пушатся в удалённый репозиторий, и удалённый репозиторий должен быть скачан и смёржен другими участниками. Между «я внёс изменение» и «все видят моё изменение» есть неизбежная задержка.
Когда вы объединяете обе модели — веб-редактор и git-репозиторий, указывающие на один контент — вы создаёте окно, в котором два человека могут вносить конфликтующие правки, не зная друг о друге. Человек А редактирует в браузере. Человек Б пушит коммит из VS Code. Ни один не знает о другом, пока не запустится синхронизация, и тогда что-то должно уступить.
Большинство платформ решают это, выбирая победителя: либо всегда побеждает база данных (Wiki.js), либо всегда побеждает git-репозиторий (большинство генераторов статических сайтов). Оба подхода молча теряют данные.
Паттерн Content Ledger
Content Ledger — это журнал только для добавления, куда записывается каждая мутация контента, независимо от её происхождения. Представьте это как журнал упреждающей записи (write-ahead log) в базе данных, но для правок документации.
Каждое изменение — из веб-редактора, API, вызова MCP-инструмента или git push — записывается как запись в реестре до применения. Каждая запись содержит:
- Временная метка — когда было сделано изменение
- Источник — откуда оно пришло (web, git, api, mcp)
- Путь страницы — какая страница была затронута
- Операция — создание, обновление, перемещение, удаление
- Хеш контента — SHA-256 нового контента
- Родительский хеш — SHA-256 контента, на основе которого было сделано изменение
Родительский хеш — ключевая инновация. Он создаёт цепочку причинности, аналогичную тому, как git-коммиты ссылаются на родительские коммиты. Когда два изменения имеют одинаковый родительский хеш, но разные хеши контента, возникает конфликт — и вы знаете о нём до того, как любое из изменений будет применено.
Как работает синхронизация: шаг за шагом
Вот что происходит во время цикла синхронизации. Valoryx запускает его автоматически с настраиваемым интервалом (по умолчанию: 30 секунд) или по требованию, когда пользователь запускает его вручную.
Шаг 1: Сбор ожидающих изменений
Движок синхронизации читает все записи реестра с момента последней успешной синхронизации. Это локальные изменения, ещё не запушенные в git.
Шаг 2: Получение удалённых изменений
Движок выполняет git fetch для получения новых коммитов из удалённого репозитория. Затем сравнивает удалённый HEAD с локальным указателем синхронизации для определения входящих изменений.
Шаг 3: Согласование
Для каждой страницы, имеющей изменения с обеих сторон (локальные записи реестра И удалённые git-коммиты), движок проверяет родительские хеши:
- Нет пересечения: Локальное изменение основано на той же версии, что и git. Fast-forward мёрж — применяются оба изменения по порядку.
- Разошлись, нет конфликта: Обе стороны изменили разные страницы. Оба набора изменений применяются независимо.
- Разошлись, та же страница: Обе стороны изменили одну и ту же страницу. Это настоящий конфликт.
Шаг 4: Разрешение конфликтов
Когда обнаруживается настоящий конфликт, Valoryx не выбирает победителя молча. Вместо этого:
- Обе версии сохраняются в реестре
- Страница отмечается как «конфликтная» в интерфейсе
- Показывается дифф между двумя версиями
- Человек выбирает, какую версию сохранить, или объединяет их вручную
Это та же модель, что и git merge с конфликтами — только через веб-интерфейс, чтобы нетехнические редакторы могли разрешать конфликты без изучения git-команд.
Шаг 5: Коммит и Push
После согласования локальные изменения коммитятся в git-репозиторий и пушатся. Сообщение коммита включает источник каждого изменения (веб-правка, вызов API и т.д.), чтобы git-история рассказывала не только что изменилось, но и как.
Как это выглядит на практике
Рассмотрим реальный сценарий. Разработчик обновляет документацию по аутентификации API из VS Code и пушит в репозиторий. Тем временем технический писатель редактирует введение той же страницы в веб-редакторе Valoryx.
С инструментом односторонней синхронизации одна правка перезаписывает другую. С Content Ledger:
- Push разработчика создаёт удалённое изменение (новый коммит на стороне git)
- Сохранение писателя создаёт локальную запись в реестре (новая мутация на стороне веб)
- Синхронизация запускается, обнаруживает, что оба изменения касаются одной страницы
- Родительские хеши расходятся — это настоящий конфликт
- Страница помечается, обе версии сохранены
- Писатель видит уведомление: «У этой страницы конфликт синхронизации» с представлением диффа
- Писатель объединяет изменения (разработчик исправил блок кода, писатель переписал введение — обе правки валидны)
- Объединённая версия коммитится и пушится
Никакой потери данных. Никаких молчаливых перезаписей. Мёрж произошёл через веб-интерфейс, а не через терминал.
Сравнение с односторонними подходами
| Сценарий | Односторонний (БД побеждает) | Односторонний (Git побеждает) | Content Ledger |
|---|---|---|---|
| Веб-правка + git push (одна страница) | Git-изменение потеряно | Веб-изменение потеряно | Конфликт выявлен, обе версии сохранены |
| Веб-правка + git push (разные страницы) | Работает | Работает | Работает |
| Быстрые веб-правки | Работает | Работает | Работает (группируются в один коммит) |
| Офлайн git-правки, массовый push | Часть изменений потеряна | Работает | Работает |
| Мёрж git-ветки в main | Непредсказуемо | Работает | Работает (мёрж-коммит обрабатывается как любой другой) |
| Переименование/перемещение в вебе + правка в git | Несовпадение путей, синхронизация ломается | Несовпадение путей, синхронизация ломается | Реестр отслеживает перемещения, пути согласовываются |
Последняя строка важнее, чем кажется. Переименование или перемещение страницы в веб-интерфейсе, пока кто-то редактирует старый путь в git — один из самых сложных крайних случаев. Большинство инструментов сдаются. Content Ledger отслеживает операции перемещения явно, поэтому знает, что /docs/auth.md стал /docs/authentication.md, и может применить входящую git-правку к правильному новому пути.
Почему бы просто не использовать Git напрямую?
Если git настолько центральный в этом дизайне, почему бы не пропустить веб-редактор и использовать git напрямую? Две причины:
Во-первых, не все в команде документации используют git. Продакт-менеджеры, инженеры поддержки и технические писатели часто предпочитают веб-редактор. Принуждение их к git-рабочему процессу создаёт трение и снижает вклад.
Во-вторых, git сам по себе не даёт опубликованной документации. Вам всё ещё нужен слой рендеринга, индексирование поиска, контроль доступа и навигационная структура. Valoryx предоставляет всё это, сохраняя git как каноническое хранилище.
Content Ledger соединяет эти два мира. Пользователи git работают в git. Веб-пользователи работают в браузере. Оба рабочих процесса первоклассные, и реестр поддерживает их согласованность.
Настройка Git-синхронизации
Если вы хотите попробовать это с собственным репозиторием:
- Установите Valoryx — один бинарный файл, без внешних зависимостей
- Создайте workspace и подключите его к git-репозиторию в настройках workspace
- Настройте URL удалённого репозитория, ветку и интервал синхронизации
- Начните редактировать с обеих сторон
Руководство по интеграции с Git охватывает полную настройку, включая конфигурацию SSH-ключей, стратегии ветвления и настройку интервала синхронизации.
Для команд, уже управляющих документацией в git-репозиториях, это означает, что вам не нужно выбирать между хорошим опытом редактирования и git-нативным рабочим процессом. Content Ledger делает оба варианта возможными без компромиссов, которые преследуют каждый другой подход, что мы тестировали.