Как использовать теги контроля версий?

Я разработал своего рода шаблон веб-сайта с брошюрой, на котором базируется большинство веб-сайтов моих клиентов. Шаблон и производные сайты хранятся вместе в репозитории Subversion. Передовой (но стабильный) код живет в /trunk; и у каждого веб-сайта есть собственная ветка, чтобы упростить настройку. Теперь, когда я приближаюсь к выпуску 2.0, я чувствую, что мне нужно примириться с тегами.

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

Могу ли я отойти от /tags/2.0? Это не может быть правдой. Где бы я зафиксировал свои изменения? Мне пришлось бы сознательно обойти родословную моей ветви. Должен ли я вручную искать ревизию ствола, которой соответствует /tags/2.0, а затем разветвлять эту ревизию в стволе? Это кажется ... громоздким. Я считаю, что до недавнего времени Subversion даже не хранила эту информацию!

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

Изменить: где я сказал «ответвление /tags/2.0», я имел в виду «проверить /tags/2.0». Но эта ошибка была и ответом на мой вопрос. По какой-то причине я никогда не думал о копировании тега. Глупо, правда? Но на мой взгляд, теги были «окончательными».

И, кстати, я полностью понимаю, что теги - это просто соглашение. Меня смущала сама конвенция, а не ее основная реализация.


person Adam Siler    schedule 10.03.2009    source источник


Ответы (5)


Я поместил bleeding edge (но стабильный) в / trunk. Когда функции для релиза завершены, я копирую / trunk в /branches/Foobar-1.2.3.X. Я немедленно копирую /branches/Foobar-1.2.3.X в /tags/Foobar-1.2.3.0 (позже это упрощает сравнение, я могу перенести /branches/Foobar-1.2.3.X в /tags/Foobar-1.2. 3.0 и посмотрите, что изменилось в моей ветке, поскольку к тому времени / trunk, скорее всего, будет другим). Окончательная разработка продолжается над функциями в /branches/Foobar-1.2.3.X, и когда я делаю выпуски, я копирую в /tags/Foobar-1.2.3.1, /tags/Foobar-1.2.3.2 и т. Д. Моя система сборки предназначен для извлечения кода только из / tags / Foobar - ????.

Это также работает для "специальных" веток: /branches/Foobar-WhizzBangFeature-1.2.X

person Andrew Barnett    schedule 10.03.2009
comment
Не могли бы вы подробнее рассказать о вашем процессе? То, что я читаю, касается каждого набора функций, который вы ветвите ... Как вы обновляете транк? Почему бы тебе не поработать в багажнике? - person Chuck Conway; 11.03.2009
comment
Большая часть работы выполняется на стволе. Я перехожу, когда закончу разработку и буду готов к контролю качества. Ошибки, которые находит QA, исправляются в ветке (и объединяются в ствол), а когда она проходит QA, она помечается и выпускается. То же самое с ошибками, обнаруженными в производственной среде: исправить в ветке, объединить с основной веткой, пометить и выпустить. - person Andrew Barnett; 11.03.2009

Всегда создавайте ответвления из ствола, если вы не хотите, чтобы ответвление происходило из какой-то точки в прошлом (прошлый тег, ветка или старая ревизия ствола).
Кроме того, вы не можете легко зафиксировать что-либо в теге; по крайней мере, клиент TortoiseSVN защищает вас с помощью сообщения.

person cherouvim    schedule 10.03.2009

Да, создайте ветку с svn copy в /branch папке репозитория для версия, которую вы хотите разветвить.

Например:

/branch
/tags
  /1.0
  /2.0
/trunk

Тогда для ветки на 2.0:

/branch
  /something2.0
/tags
  /1.0
  /2.0
/trunk
person FerranB    schedule 10.03.2009

Вы делаете копию (используя 'svn copy') вашего каталога тегов в / branch (или там, где вы храните свои ветки), возможно, используя 2.0-hotfix или что-то подобное как имя ветки (отличное от имени тега).

Это настолько просто, насколько возможно. В SVN на самом деле нет тегов и веток, только каталоги и файлы. Все зависит от вашей политики.

Возможно, более естественным способом было бы сначала создать ветку 2.0, стабилизировать код в ветке, а затем создать тег из ветки.

person Community    schedule 10.03.2009

Я предполагаю, что вы используете Tortoise SVN. Предположим, у вас есть следующая ситуация:

/trunk
/braches
   /branch1
   /branch2
/tags
   /1.0
   /2.0

Тогда все, что вам нужно сделать, это:

  • откройте репо-браузер черепахи
  • перейдите в корень и разверните все, чтобы вы могли видеть, что вы делаете
  • выберите папку /tag/2.0
  • Ctrl-перетащите, чтобы скопировать его в папку / branch
  • переименовать новую папку (или нет)

И это все. Затем вам нужно было проверить /branches/tag/2.0 (или как вы его называли), чтобы поработать над этим.

Вам нужно всегда думать о SVN как о файловой системе. Имена и значения, которые вы даете вещам в этой файловой системе, зависят от вас. Тот факт, что вы не можете редактировать, например, «теги», - это просто соглашение - базовой файловой системе все равно, редактируете вы их или нет.

person Community    schedule 10.03.2009