Сейчас вы уже понимаете, что Subversion очень гибкая система. Учитывая то, что ветки и метки имеют одну и ту же основу (копии директорий), а также то, что ветки и метки являются обычными элементами файловой системы, Subversion многих пугает. Она слишком гибкая. В этом разделе мы предложим несколько советов по компоновке и поддержке информации с течением времени.
Существует несколько стандартных, рекомендуемых способов
организации хранилища. Как правило, создается директория
trunk
, в которой находится
«главная линия» разработки, директория
branches
для хранения веток и директория
tags
для хранения меток. Если хранилище
содержит только один проект, обычно создают три директории
верхнего уровня:
/trunk /branches /tags
Если хранилище содержит несколько проектов, администратор, обычно создает такую структуру для каждого проекта отдельно (за более подробной информацией о «корне проекта» обратитесь в раздел «Choosing a Repository Layout»):
/paint/trunk /paint/branches /paint/tags /calc/trunk /calc/branches /calc/tags
Конечно, вы можете не использовать такие типовые структуры. Вы можете сделать любую разновидность, которая будет удобна для вас или вашей команды. Помните о том, какой бы вы выбор не сделали, он может быть не окончательным. Хранилище можно реорганизовать в любое время. Учитывая то, что ветки и метки являются обычными директориями, команда svn move может переместить или переименовать их по вашему усмотрению. Переход от одной структуры к другой означает просто несколько последовательных передвижек на сервере; если организация хранилища вам не нравится, просто поменяйте местами директории.
Однако не забывайте о том, что несмотря на легкость перемещения директорий, нужно помнить и о других пользователях. Ваши перестановки могут дезориентировать пользователей с существующими рабочими копиями. Если у пользователя есть рабочая копия отдельной директории хранилища, то ваше использование svn move может удалить этот путь из последней правки. Когда в очередной раз пользователь запустит svn update, он будет проинформирован о том, что его рабочая копия отражает путь, который больше не существует, и пользователь будет вынужден переключиться (svn switch) на новое местоположение.
Еще одним замечательным свойством модели Subversion
является то, что ветки и метки могут иметь конечную
продолжительность жизни, так же как и все другие версионированные
элементы. Например, предположим вы наконец закончили все работы
в ваше личной ветке проекта calc
. После
объединения изменений с /calc/trunk
,
нет причин продолжать хранить эту ветку:
$ svn delete http://svn.example.com/repos/calc/branches/my-calc-branch \ -m "Removing obsolete branch of calc project." Committed revision 375.
Больше вашей ветки не существует. Конечно, на самом деле она
не исчезла: просто ее больше нет в правке HEAD
,
она больше никого не отвлекает. Если воспользоваться командами
svn checkout, svn switch
или svn list для обращения к ранним правкам,
свою старую ветку вы увидите.
Если просмотра удаленной директории не достаточно, вы всегда
можете восстановить эту директорию. Восстановление информации в
Subversion выполнить очень просто. Если есть директория или файл,
который вы хотите вернуть обратно в HEAD
,
просто воспользуйтесь svn copy -r для того,
что бы скопировать его из старой правки:
$ svn copy -r 374 http://svn.example.com/repos/calc/branches/my-calc-branch \ http://svn.example.com/repos/calc/branches/my-calc-branch Committed revision 376.
В нашем примере ваша личная ветка имеет относительно
короткую продолжительность жизни: возможно она создавалась
для того, что бы исправить ошибку или реализовать новую функцию.
После того, как работа завершена, завершена и ветка. При разработке
программного обеспечения, тем не менее, часто имеют две
«главных» ветки, существующих рядом довольно долгое
время. Допустим, пришло время выпустить релиз стабильной версии
проекта calc
, а вы знаете, что нужна будет пара
месяцев для того, что бы вытрясти из программы последние ошибки.
Разработчики не должны добавлять в проект новых функции, но при этом
и работа не должна останавливаться. В подобной ситуации создается
«стабильная» ветка программы, которая существенно
изменяться уже не будет:
$ svn copy http://svn.example.com/repos/calc/trunk \ http://svn.example.com/repos/calc/branches/stable-1.0 \ -m "Creating stable branch of calc project." Committed revision 377.
После этого, разработчикам ничего не мешает продолжать добавлять
в /calc/trunk
новые передовые (или экспериментальные)
функции, а в правилах проекта можно указать, что в
/calc/branches/stable-1.0
должны фиксироваться
только исправления ошибок. По мере того, как будет продвигаться
работа над главной линией разработки, исправленные ошибки будут
выборочно портироваться в стабильную ветку. Даже после выхода релиза
стабильной ветки, она может продолжать поддерживаться долгое время
— столько, сколько этот релиз будет продолжать поддерживаться
для пользователей.