Как именно файлы subversion хранят в репозитории?
Я читаю книгу подрывников, и мне ясно, что подрывная деятельность не хранит отдельные файлы, а только дельта, чтобы минимизировать дисковое пространство. Subversion также делает то же самое с бинарными файлами (это было огромной слабостью CVS).
Однако я не понимаю точного механизма. Когда я делаю файл, что происходит?
- Subversion хранит только diff (и уже имеет старую версию)
- Subversion удаляет предыдущую версию, сохраняет новый файл без изменений и создает обратный diff, чтобы при необходимости "повторно создать" старую версию.
- Что-то еще, о чем я не думал.
Первый случай может показаться наиболее логичным. Это, однако, вызывает другой вопрос. Если у меня есть в репозитории subversion файл с 1000 коммитов, а новый разработчик проверяет чистую копию, тогда подрывная деятельность должна будет получить исходную версию (первоначальный импорт) и применить к ней 1000 diff, прежде чем возвращать результат. Это верно? Существует ли какое-то кэширование файлов, в которых сохраняется и последняя версия?
В основном, где я могу найти информацию о внутренних хранилищах svn?
Обновление: Очевидно, что бэкэнд подрывной деятельности играет большую роль в этом. В то время
или запись FSFS использует вариант 1, в то время как BDB использует вариант 2. Спасибо msemack!
Ответы
Ответ 1
Поскольку формат репозитория Subversion полностью внутренне, они могут изменять представление из одной версии в другую. Я считаю, что текущая ревизия обычно хранит обратные дельта (ваш вариант 2), но также периодически сохраняет полные моментальные снимки, поэтому ему не нужно разрешать 1000 разностей перед возвратом результата.
В примечаниях к выпуску Subversion 1.6 есть раздел "Улучшения файловой системы" , в котором есть некоторые заметки об этом и ссылки на другие источники. Достаточно сказать, что детали хранения данных Subversion сложны и могут быть изменены.
В дереве исходных текстов Subversion также содержится проектный документ, в котором описывается использование пропустить дельта в Subversion. Как правило, каталог /notes/ содержит несколько полезных документов, касающихся внутренних элементов Subversion.
Ответ 2
Из документа Subversion Design (который довольно устарел) вы можете получить это:
Как и многие другие системы контроля версий, хранилища Subversion меняются как различия. Он не делает полные копии узлов; вместо этого он сохраняет последнюю версию как полный текст и предыдущие версии как последовательность обратных различий (слово "diff" используется здесь свободно - для файлов это означает "vdeltas", для каталогов, это означает формат, который выражает изменения в каталоги).
Я не думаю, что это было изменено с тех пор.
Также см. Метод Bubble-Up.
Ответ 3
Я полагаю, что следующая ссылка поможет вам понять архитектуру fsfs
http://svn.apache.org/repos/asf/subversion/trunk/subversion/libsvn_fs_fs/structure
Ответ 4
может вам помочь регулярная спецификация FSFS.
Или, если вы используете Berkeley DB, здесь спецификация для этого.
FSFS использует обратные дельта для хранения изменений и skip-deltas, чтобы ускорить некоторые действия, если я все правильно понял.
Ответ 5
Каждый раз, когда вы совершаете изменения, хранилище хранит новую версию это общее дерево репозитория и маркирует новое дерево новым номер ревизии. Конечно, большая часть дерево такое же, как и ревизия до, за исключением частей, которые вы изменилось.
Новый номер версии - это последовательная метка, которая применяется к всего нового дерева, а не только файлов и каталоги, которые вы коснулись пересмотр. Однако, в просторечии, номер ревизии используется для обозначения изменение, внесенное в этот пересмотр; например, "изменение в r588", ( "r588" является сокращением для "пересмотра 588" ) действительно означает "различие между деревьями 587 и 588 репозитория", или по-другому ", внесенное изменение к дереву 587 для получения дерева 588".
Взгляните на: Вопросы Subversion