Как именно Subversion хранит файлы в репозитории?

Я прочитал книгу по Subversion, и мне стало ясно, что Subversion хранит не отдельные файлы, а только дельты, чтобы минимизировать дисковое пространство. Subversion делает то же самое и с двоичными файлами (раньше это было огромной слабостью CVS).

Однако я не понимаю точного механизма. Что происходит, когда я фиксирую файл?

  1. Subversion хранит только разницу (и уже имеет старую версию)
  2. Subversion удаляет предыдущую версию, сохраняет новый файл без изменений и создает обратную разницу, чтобы «воссоздать» старую версию, если это необходимо.
  3. Что-то еще, о чем я не подумал.

Первый случай может показаться наиболее логичным. Однако здесь возникает другой вопрос. Если у меня в репозитории Subversion есть файл с 1000 коммитов, а новый разработчик проверяет чистую копию, тогда Subversion должна будет получить исходную версию (начальный импорт) и применить к ней 1000 изменений перед возвратом результата. Это правильно? Есть ли какое-то кеширование для файлов, в которых также хранится последняя версия?

В принципе, где я могу найти информацию о внутреннем устройстве репозитория svn?

Обновление. По-видимому, большую роль в этом играет внутренняя часть Subversion. На момент написания FSFS использует вариант 1, а BDB - вариант 2. Спасибо, msemack!


person kazanaki    schedule 25.02.2010    source источник
comment
Незначительное исправление: более поздние версии Subversion также делают то же самое с двоичными файлами. Subversion ВСЕГДА делала это (по крайней мере, до версии 0.3.x).   -  person myron-semack    schedule 25.02.2010
comment
возможное дублирование производительности SVN после многих изменений   -  person Kyle Rosendo    schedule 01.03.2011
comment
Я также нахожу это очень запутанным. Доступно несколько бэкэндов, bdb и fsfs. Кроме того, есть документы о пузыре, скип-дельте, которые, кажется, противоречат друг другу. Как в настоящее время репозиторий svn по умолчанию хранит свои файлы?   -  person Thomas    schedule 15.01.2017


Ответы (5)


Поскольку формат репозитория Subversion является полностью внутренним, они могут свободно изменять представление от одной ревизии к другой. Я считаю, что текущая ревизия обычно хранит обратные дельты (ваш вариант 2), но также периодически сохраняет полные снимки, поэтому ему не нужно разрешать 1000 различий перед возвратом результата.

В примечаниях к выпуску Subversion 1.6 есть раздел об улучшениях хранения файловой системы в котором есть некоторые примечания по этому поводу и ссылки на другие источники. Достаточно сказать, что детали хранения данных Subversion сложны и могут изменяться.

В дереве исходного кода Subversion также есть проектный документ, в котором описывается использование пропускать дельты в Subversion. Как правило, каталог / notes / содержит несколько полезных документов, касающихся внутреннего устройства Subversion. .

person Greg Hewgill    schedule 25.02.2010

Из документа Subversion Design (что вполне хотя) вы можете получить это:

Как и многие другие системы контроля версий, Subversion сохраняет изменения как различия. Он не делает полные копии узлов; вместо этого он сохраняет последнюю ревизию как полный текст, а предыдущие ревизии как последовательность обратных различий (слово «diff» здесь используется свободно - для файлов это означает vdeltas, для каталогов это означает формат, который выражает изменения в каталоги).

Не думаю, что с тех пор что-то изменилось.

Также см. Пузырьковый метод.

person Anton Gogolev    schedule 25.02.2010
comment
Проектный документ, на который вы ссылаетесь, относится к старому формату базы данных Berkeley DB, который SVN больше не использует по умолчанию. - person myron-semack; 25.02.2010

Я считаю, что следующая ссылка поможет понять архитектуру fsfs

http://svn.apache.org/repos/asf/subversion/trunk/subversion/libsvn_fs_fs/structure

person Jeyanthan I    schedule 06.10.2011

вам может помочь стандартная спецификация FSFS.

Или, если вы используете Berkeley DB, вот спецификация для этого.

FSFS использует обратные дельты для хранения изменений и skip-deltas для ускорения некоторых действий, если я все правильно понял.

person Zenon    schedule 25.02.2010

Каждый раз, когда вы фиксируете изменение, репозиторий сохраняет новую ревизию этого общего дерева репозитория и маркирует новое дерево новым номером ревизии. Конечно, большая часть дерева такая же, как и в предыдущей ревизии, за исключением тех частей, которые вы изменили.

Новый номер ревизии - это последовательная метка, которая применяется ко всему новому дереву, а не только к файлам и каталогам, которых вы коснулись в этой ревизии. Однако в разговорной речи номер редакции используется для обозначения изменения, зафиксированного в этой редакции; например, «изменение в r588» («r588» - это сокращение от «ревизия 588») на самом деле означает «различие между деревьями репозитория 587 и 588», или, другими словами, «изменение, внесенное в дерево 587 для создания дерева 588». ".

Взгляните на: Часто задаваемые вопросы о Subversion

person Asad    schedule 25.02.2010