Ответвления и метки

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

Другой возможностью систем управления версиями является способность помечать частные ревизии (например, версию выпуска), так что вы сможете в любое время воссоздать конкретную сборку или окружение. Этот процесс известен как создание метки.

В Subversion нет специальных команд для работы с ответвлениями или метками, вместо этого используются так называемые «легкие копии» (cheap copies). Легкие копии похожи на жесткие ссылки в Unix: это означает, что вместо того, чтобы сделать полную копию в хранилище, создаётся внутренняя ссылка, указывающая на определённое дерево/ревизию. В результате, ответвления и метки создаются очень быстро, и почти не занимают дополнительного места в хранилище.

Создание ответвления или метки

Если вы импортировали ваш проект с рекомендованной структурой папок, создать ответвление или метку очень просто:

Рисунок 4.51. Диалог создания ответвления/метки

Диалог создания ответвления/метки


Выберите папку в рабочей копии, которую вы желаете скопировать в ответвление или пометить, затем выберите команду TortoiseSVNОтветвление/Метка....

По умолчанию, целевым URL для нового ответвления будет URL источника, базового для вашей рабочей копии. Вы должны изменить этот URL так, чтобы он указывал новый путь вашего ответвления/метки. Так, вместо

http://svn.collab.net/repos/ProjectName/trunk
      

вы можете использовать что-то вроде

http://svn.collab.net/repos/ProjectName/tags/Release_1.10
      

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

промежуточные папки

Когда вы указываете URL-адрес назначения все папки от первой до самой последней должны существовать, иначе вы получите сообщение об ошибке. В вышеприведенном примере URL-адрес http://svn.collab.net/repos/ProjectName/tags/ должен существовать, чтобы создать метку Release_1.10.

Однако, если вы хотите создать ответвление/метку на URL, в котором есть промежуточные папки, которые ещё не существуют, то вы можете отметить параметр Создавать промежуточные папки в нижней части диалога. Если этот параметр включен, то все промежуточные папки создаются автоматически.

Заметьте, что этот параметр по умолчанию отключен во избежание опечаток. Например, если вы набрали URL назначения как http://svn.collab.net/repos/ProjectName/Tags/Release_1.10 вместо http://svn.collab.net/repos/ProjectName/tags/Release_1.10, то вы можете получить ошибку при отключённом параметре, но при включённом параметре папка Tags будет создана автоматически, и в результате получится папка Tags и папка tags.

Теперь вы должны выбрать источник для копии. Здесь у вас есть три возможности:

Ведущая ревизия в хранилище (HEAD)

В новое ответвление копируется ведущая ревизия непосредственно в хранилище. Не надо передавать никаких данных из вашей рабочей копии, и ответвление создаётся очень быстро.

Указанная ревизия в хранилище

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

Рабочая копия

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

Если вы желаете, чтобы ваша рабочая копия автоматически переключилась на вновь созданное ответвление, используйте флажок Переключить рабочую копию на новое ответвление/метку. Но если вы сделаете это, сначала убедитесь, что ваша рабочая копия не содержит изменений. Если содержит, эти изменения будут слиты с ответвлением при переключении.

Если ваша рабочая копия содержит другие проекты добавленные через свойство svn:externals, то такие внешние проекты будут перечислены внизу диалога ветки/метки. Для каждого внешнего проекта отображается путь назначения и исходный адрес URL.

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

Внешние включения автоматически закрепляются на текущей ревизии HEAD или ревизии BASE рабочей копии в зависимости от источника ветки/метки:

Таблица 4.1. Закреплённая ревизия

Источник копииЗакреплённая ревизия
Ведущая ревизия в хранилище (HEAD)ревизия HEAD внешнего хранилища
Указанной ревизии в хранилищеревизия HEAD внешнего хранилища
Рабочая копияревизия BASE внешней рабочей копии


внешние внутри внешних

Если проект, который добавлен как внешний, сам имеет внешние включения, то они не будут помечены тэгом. Только внешние включения, которые являются прямыми потомками, могут быть помечены тэгом.

Нажмите ОК для фиксации новой копии в хранилище. Не забудьте ввести сообщение журнала. Обратите внимание: копия создаётся внутри хранилища.

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

Другие способы создания ответвления или метки

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

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

Еще один способ — это диалог журнала. Вы можете открыть диалог журнала, например, для trunk, выбрать ревизию (ревизию HEAD на самом верху или ранюю ревизию), сделать правый клик и выбрать Создать ответвление/метку из ревизии....

Извлечь? Или переключиться?..

...вот в чём вопрос (хотя на самом деле нет). Если извлечение загружает всё из выбранного ответвления в хранилище в вашу рабочую папку, то TortoiseSVNПереключить... передаёт только изменённые данные в вашу рабочую копию. Хорошо для загрузки сети, хорошо для вашего терпения. :-)

Для того, чтобы приступить к работе с вашей свежесгенерированным ответвлением или меткой, у вас есть несколько способов. Вы можете:

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

  • Переключить вашу рабочую копию на вновь созданную копию в хранилище. Выберите папку самого верхнего уровня для вашего проекта и выполните TortoiseSVNПереключить... из контекстного меню.

    В следующем диалоге введите URL ответвления, которое вы только что создали. Выберите в переключателе Ведущая ревизия (HEAD) и нажмите ОК. Ваша рабочая копия будет переключена на новое ответвление/метку.

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

  • Если вы желаете работать в стволе и в ответвлении, но не желаете выполнять затратное свежее извлечение, вы можете воспользоваться Проводником Windows для создания копии уже извлечённого ствола в другой папке, после чего TortoiseSVNПереключить... эту копию на ваше новое ответвление.

Рисунок 4.52. Диалог переключения

Диалог переключения


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

  • Метки, как правило, используются для создания статического снимка проекта на некоторой стадии. Сами они, как таковые, обычно не используются для разработки - для этого предназначены ответвления, и именно по этой причине мы изначально рекомендовали структуру хранилища в виде /trunk /branches /tags (/ствол /ответвления /метки). Работа в помеченной ревизии не очень хорошая идея, но так как ваши локальные файлы не защищены от записи, нет ничего, что бы вас остановило, если вы это сделаете по ошибке. Однако, если вы попытаетесь выполнить фиксацию в хранилище по пути, в котором присутствует /tags/, TortoiseSVN вас предупредит.

  • Возможно, вам понадобится произвести дальнейшие изменения в уже помеченную выпущенную версию. Правильным образом действий в такой ситуации будет сначала создать новое ответвление из этой метки, зафиксировать его, сделать ваши изменения в этом ответвлении, после чего и создать новую метку из этого нового ответвления, например Version_1.0.1.

  • Если вы измените и зафиксируете созданную из ответвления рабочую копию, тогда все изменения попадут в новое ответвление, а не в основной ствол. Запоминаться будут только изменения, всё остальное останется в виде лёгкой копии.