Общие замечания по версиям, ветвям и тегам.
- Версия проекта - состояние проекта в некий заданный момент времени. Версии проекта различаются по своим номерам.
- Ветвление разработки (branching) - происходит при появлении необходимости вести параллельно разработку нескольких версий проекта. Например, дальнейшая разработка основной ветви проекта (добавление нового функционала, переработка структуры и т.п.) и поддержание (исправление ошибок) выпущенного релиза проекта.
- Тег (tag) - зафиксированная версия проекта, с определённым названием. Как правило, служит для определения некого события в процессе разработки, например, выпуска очередной версии продукта.
- Объединение ветвей разработки (merging) необходимо для внесения в одну ветвь разработки изменений, сделанных в другой ветви с момента (тега) распараллеливания разработки. Например, внесение в текущую разрабатываемую ветвь (trunk branch) исправлений ошибок в стабильной ветви проекта.
- Ветвление разработки также может происходить при желании одного из разработчиков внести в проект существенные изменений. Посколько такие изменения, как правило, сопровождаются неким периодом неработоспособности проекта или невозможности его сборки, то имеет смысл произвести ветвление проекта, независимо от других разработчиков проводить изменения с ветвью (с выполнением отдельных обновлений репозитория), и после стабилизации ветви - слияние её с основной ветвью.
- В Subversion каждая версия имеет уникальный номер - целое число (порядковый номер сделанного обновления проекта в репозитарии). Кроме того, версии проекта можно различать по их датам.
- В случае задания временной отметки для обозначения версии следует помнить, что она обозначает версию проекта _на заданное время_. Т.е. версия от '2004-01-01' - это последняя версия, внесённая в репозитарий _до_ '2004-01-01T00:00:00+0000', а не версия, внесённая '2004-01-01T00:00:01+0000'.
- В случае задания версии её номером необходимо помнить, что номер относится к обновлению репозитория. Т.е., при наличии в репозитории нескольких проектов - номера версий конкретного проекта отнюдь не последовательные; при наличии нескольких ветвей разработки - номера версий отдельных ветвей не обязательно последовательные, и т.д. Версии отдельных файлов - не последовательные, если эти файлы не менялись каждое обновление.
- Виды записи номеров версий:
- ''NNN'' - версия номер NNN
- ''{TIMESTAMP}'' - дата версии{{Версия _к_ указанному времени}}, дата, время или временная отметка, в формате ISO.
- ''HEAD'' - последняя версия в репозитории
- ''BASE'' - версия рабочей копии
- ''COMMITED'' - последняя версия изменений, внесённых в рабочую копию
- ''PREV'' - версия до последней версии изменений, внесённых в рабочую копию (COMMITED-1)
- Ветви и теги версий проекта в Subversion оформляются одинаково с точки зрения выполняемых команд. В связи с возможностью Subversion вести историю копий файлов, и ветви, и теги создаются с помощью _копирования_ проекта в директорию с требуемым именем.
- Согласно принятых соглашений, структура директории проекта XXX следующая:
XXX --- trunk -- dir1 # Основная ветвь проекта (HEAD)
| `- dir2
|
|--branches # Ветви проектов
| |
| |--branch_A -- dir1
| | `- dir2
| |
| `--branch_B -- dir1
| `- dir2
|
`--tags # Теги
|
`-----version_A -- dir1
`- dir2
В начале проекта в репозитории создаётся каталог проекта XXX и подкаталоги trunk, branches, tags. Основная ветвь разработки проекта хранится в директории trunk. При необходимости создания ветви разработки выполняется команда svn copy trunk branches/branch_A
. Возможно выполнении копирования непосредственно с URL репозитария. В последствии, при необходимости получения рабочей копии, возможно получение отдельно как trunk, так и branch_A и работа с ними по-отдельности: svn checkout file://repository/branches/branch_A
. Т.к. Subversion было указано, что branch_a - копия trunk, возможно получение изменений произвольной версии branch_a по сравнению с trunk.
Работа с ветвями и тегами в Subversion
Создание ветви/тега
$ svn copy trunk branches/branch
$ svn commit
... или ...
$ svn copy <URL/trunk> <URL/branches/branch>
Отслеживание версий файла и изменений в нём
$ svn log --verbose <file>
$ snv log --verbose --stop_on_copy <file>
$ svn diff -r XXX:YYY <URL/trunk>
Слияние ветвей
$ svn merge -r XXX:YYY <URL/trunk>
Для слияния ветвей следует использовать именно merge, т.к. diff не отслеживает удаление/добавление файлов и директорий.
Для предпросмотра возможных изменений можно использовать
$ svn merge –dry-run -r XXX:YYY <URL/branches/branch>
Получение заданной версии ветви
$ svn checkout -r XXX <URL>
- Переключение рабочей копии на заданную версию (включая переходы между ветвями):
$ svn switch -r XXX <URL>
Этот путь отличается от checkout отсутствием необходимости выкачивать _всё_ дерево, передаются только изменения.
Удаление ветви
Выполняется как удаление каталога с ветвью. Естественно, удалённую ветвь можно восстановить, получив её существовавшую версию.
$ svn remove <URL/branches/branch>
Дата создания: 2006-05-24 12:24:31 (Фетисов Н. А. (naf))
Последнее изменение: 2006-07-16 14:55:40 (Фетисов Ф. А. (faf))
Владелец: Фетисов Н. А. (naf)
Версия: 2 Все версии