Как переместить тег в SVN - PullRequest
6 голосов
/ 08 мая 2011

Этот вопрос можно перефразировать как:

Как я могу включить одно изменение в стволе определенного файла в существующую TAG.

Простой вопрос, но я не былЯ в состоянии решить эту проблему самостоятельно.

Концепция исходит от других инструментов SCM, в которых вы просто перемещаете тег по различным ревизиям и «прикрепляете» его к нужной ревизии.Эти другие инструменты имеют собственное понимание того, что такое тег, где SVN обобщил все как копию.

Ниже приведены ответы, которые я видел на других досках объявлений и сообщениях на эту же тему, и поэтому они уже рассматривались.и отклонено:

  1. Это неправильное использование SVN
    • На самом деле, SVN был разработан, чтобы быть универсальным и выполнять множество шаблонов использования
    • Это миссиянайти ответ.Я понимаю проблемы и возможность никогда не найти ответа.Может быть, я переключусь на другой инструмент.
  2. Почему вы используете SVN такой, наш, так что лучше делать то и это.
    • Существует множество моделей использования или моделей SCM, которые можно использовать.В моем случае, в частности:
      • Trunk представляет собой текущее развитие, и к нему применяются небольшие исправления.
      • Production - это один TAG
      • , оборот от разработки оченькороткие и агрессивные, и поэтому мы не можем работать с несколькими законченными производственными выпусками.Это означает, что я не могу каждый раз создавать новый тег для каждого небольшого дополнительного изменения, развернутого в производственном процессе.
      • Таким образом, вкратце "Полные упакованные производственные выпуски не существуют в моем сценарии".
    • Это мой сценарий использования, который мне нужен.

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

Ответы [ 5 ]

3 голосов
/ 10 апреля 2013

Я нашел 1 простой способ сделать это (т. Е. Переместить тег для файла) с помощью черепахи SVN.

  1. просмотреть репозиторий, щелкнув правой кнопкой мыши на выбранном каталоге проекта и выбрав «Черепаха»SVN-> Repo-browser "
  2. Перейдите к файлу, который вы хотите изменить, в вашем теге / каталоге
  3. щелкните файл правой кнопкой мыши и выберите« оформить заказ ».
  4. ВыбратьВременный каталог на вашем HD и нажмите ОК.
  5. Перезапишите этот файл вашей обновленной версией (используя локальный файл-эксплорер, а не браузер репозитория SVN)
  6. щелкните файл правой кнопкой мыши и выберите «SVN checkin ".

Задание выполнено.

Чтобы сделать то же самое с помощью CVS, тривиально, просто перейдите в требуемый каталог и введите:" cvs tag -F tagname filename "SVNна самом деле нет тегов, что делает его неудобным для использования (на мой взгляд).

Не уверен, почему за него проголосовали - именно так мы решаем точную задачу, поставленную в вопросе.

3 голосов
/ 08 мая 2011

Теги и ветки в SVN не отличаются.Все различие заключается в политиках, которым следуют команды для работы с тегами и ветвями.

Таким образом, вы можете объединить изменения в тег и зафиксировать новую ревизию так же, как вы делали бы это с веткой.Понятно, что обычно вы не хотите этого делать, чтобы «пометить» точные версии файлов, которые вы использовали для выпуска.Но если это действительно необходимо, вы можете сделать исключение из этого правила один раз.

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

Несколько ссылок на книгу SVN: " Теги ", " Техническое обслуживание филиала "


ДОБАВЛЕНО: Итак, звучит, что такая повторная пометкаэто не редкий, нетипичный случай использования, а скорее регулярная практика в вашей команде.Кажется, с помощью тегов вы не просто даете имя определенному снимку ваших файлов, но хотите, чтобы это имя следовало за последующими обновлениями файлов, забывая свое прежнее место.Также кажется, что вы находите ветки неудобными для вашего рабочего процесса.

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

2 голосов
/ 10 апреля 2013

Теги и ветки в Subversion - это просто каталоги. Концепция того, чем они являются, заложена не в Subversion, а в вашем мозгу.

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

Например,

  • Мне нужен тег, показывающий утвержденные изменения: сделайте его веткой вместо тега.
  • Я хочу показать, какие файлы использовались для последней сборки: То же самое.
  • Я хочу показать, какой код проверен: То же самое.

Но это не ветви! вы скулите претензий.

Очень хорошо, предложенная структура хранилища - это просто: предложение. Вы можете добавить еще один каталог, кроме trunk, tags и branches для этих подвижных тегов :

$repo/trunk
$repo/branches
$repo/tags
$repo/moveable_tags

Теперь вы можете поместить теги, которые вы меняете, в moveable_tags , а теги, которые люди используют для релизов, снимков и т. Д., В теги .

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

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

Вместо этого я добавил каталоги obsolete/tags и obsolete/branches на уровень каталогов trunk, tags и branches. Вместо того, чтобы удалять устаревшие теги и ветки, я просто перемещал их. tags и branches не были загромождены, и руководители и разработчики почувствовали себя лучше, если бы знали, что должны найти эти устаревшие ветки и теги, если они когда-либо понадобятся.


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

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

Чтобы внести изменения в тег:

  • Проверьте тег.
  • Внести изменения.
  • Передайте ваше изменение.

Или, что еще лучше, используйте svn cp, svn mv или svn delete против URL хранилища, а не против рабочего каталога. Например, я создал тег для выпуска 2.0. Внезапно мы поняли, что забыли одно очень важное изменение, которое происходит в этом выпуске. Вместо проверки вы делаете это:

$ svn cp -r 23933 -m"This change in this file should have been included in the tag" \
    $repo/trunk/foo/src/foo.java $repo/tags/2.0/foo/src/foo.java

Когда вы посмотрите историю этого тега, вы увидите.

 $svn log -v $repo/tags/2.0
 ------------------------------------------------------------------------
 r23945 | david | 2013-04-03 11:21:55 -0400 (Wed, 3 Apr 2013) | xxx lines
 Changed paths:
 M /tags/2.0/foo/src/foo.java (from /trunk/foo/src/foo.java:23933)

 This change in this file should have been included in the tag

 ------------------------------------------------------------------------
 r23932 | david | 2013-04-10 11:18:40 -0400 (Wed, 10 Apr 2013) | 1 line
 Changed paths:
 A /tags/2.0 (from /trunk:23921)

 Created release 2.0

Я вижу, что тег был создан неделю назад из ревизии 23921 на стволе. Затем я вижу, что файл foo.java был обновлен через неделю с версии 23933 в транке.

1 голос
/ 09 мая 2011

Ваш комментарий к ответу @Alexey Kukanov указывает на то, что вам действительно нужна ветвь, а не тег.Тег - это историческая запись одного неизменного момента времени.Ветвь - это копия кода, которая со временем подвергнется дальнейшим изменениям.Вы говорите о последнем.Обычной практикой является создание веток «bugfix» или «production» для каждого поддерживаемого релиза и либо фиксация изменений непосредственно в ветке [1], либо слияние их из ствола.

Теги, в этомcase, будет использоваться для создания «копий» ветви, чтобы указать «именно этот код был в производстве в это конкретное время».Таким образом, вы можете легко вернуться и сравнить с ним, если возникнет такая необходимость.

[1] ... и позже объединить их в магистраль, в зависимости от ситуации

0 голосов
/ 01 октября 2013

Мне тоже нужно сделать это когда-нибудь. Что вы делаете, вы извлекаете свой svn-файл из тега, а не из ветви (так что-то вроде svn: // blahblah / tags / mytag, а не svn: // blahblah / branch / mybranch), затем вы фиксируете измененный файл там и у него будет обновленный тег.

...