Создание эффективной системы контроля версий без дублирования файлов
Хранение полных копий файлов для каждой версии или форка приводит к пустой трате места. Если вы измените одну строку в проекте из десяти файлов, вам не нужно заново сохранять все десять файлов.
Я столкнулся с этой проблемой при разработке своего проекта LaTeX Writer. Мне нужен был способ управления версиями и форками проектов без высоких затрат на хранение данных.
Я изучил принцип работы GitHub. GitHub не сохраняет полный репозиторий каждый раз, когда вы вносите изменения. Он хранит контент отдельно и использует ссылки для связи файлов и коммитов.
Я построил свою систему на основе трех основных компонентов:
- Metadata: здесь хранятся ID проектов, владельцев и папок.
- File Records: они хранят имена файлов и ссылки на контент.
- Blobs: здесь хранится сам контент.
Система работает на основе хеширования контента. Когда вы сохраняете файл, система генерирует уникальный ID на основе его содержимого. Если такой контент уже существует, система повторно использует существующий Blob. Новый не создается.
Такой подход делает форки простыми и дешевыми. Когда вы делаете форк проекта:
- Система создает новый Project ID.
- Она создает новые метаданные для файлов и папок.
- Она направляет новые метаданные на существующие Blobs.
При форке фактический контент файлов не копируется. Вы дублируете только небольшие записи метаданных.
При редактировании форка процесс остается эффективным:
- Вы изменяете контент.
- Система хеширует новый контент.
- Она создает новый Blob только в том случае, если точно такого контента еще нет.
- Метаданные вашего форка указывают на новый Blob.
- Оригинальный проект по-прежнему указывает на старый Blob.
Этот метод дает несколько преимуществ:
- Дедупликация контента экономит огромное количество места.
- Форки происходят мгновенно.
- Управление версиями остается организованным.
- Рост базы данных замедляется.
Вы получаете функциональность, подобную GitHub, без огромных затрат на хранение.