Как именно Subversion хранит файлы в хранилище? - PullRequest
48 голосов
/ 25 февраля 2010

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

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

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

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

В основном, где я могу найти информацию о внутреннем хранилище SVN?

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

Ответы [ 5 ]

14 голосов
/ 25 февраля 2010

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

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

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

9 голосов
/ 06 октября 2011

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

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

7 голосов
/ 25 февраля 2010

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

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

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

Также см. Метод всплытия .

3 голосов
/ 25 февраля 2010

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

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

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

1 голос
/ 25 февраля 2010

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

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

Посмотрите на: FAQ по Subversion

...