Как правильно создать тег SVN из транка? - PullRequest
270 голосов
/ 12 мая 2009

Я создаю свой первый проект в Subversion . Пока у меня есть

 branches
 tags
 trunk

Я думаю, что мне нужно немедленно сделать ветви единичными и начать все сначала. Обновление веток это норма.

Я выполнял работу в транке и перемещал содержимое в теги следующим образом.

mkdir tags/1.0
cp -rf trunk/* tags/1.0
svn add tags/1.0
svn commit -m " create a first tagged version"

Моя интуиция говорит мне, что это совершенно неправильно, и я должен поддерживать некоторые отношения между файлами, используя svn copy. Файлы, которые я создаю таким образом, не будут иметь никакого отношения друг к другу, и я уверен, что пропущу функции Subversion. Я прав?

Должен ли я использовать svn copy для отдельных файлов?

mkdir tags/1.0
svn add tags/1.0
svn copy trunk/file1 tags/1.0
svn copy trunk/file2 tags/1.0
svn copy trunk/file3 tags/1.0
svn commit -m " create a first tagged version"

Должен ли я использовать svn copy для всего каталога?

svn copy cp -rf trunk tags/1.0
svn commit -m " create a first tagged version"

Ответы [ 9 ]

414 голосов
/ 12 мая 2009

Использование:

svn copy http://svn.example.com/project/trunk \
      http://svn.example.com/project/tags/1.0 -m "Release 1.0"

Стенография:

cd /path/to/project
svn copy ^/trunk ^/tags/1.0 -m "Release 1.0"
183 голосов
/ 12 мая 2009

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

Вы правильно догадались, что copy - это операция для использования; это позволяет Subversion отслеживать историю этих файлов, а также (я полагаю) хранить их гораздо эффективнее.

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

Эта часть "книги" показывает, как обычно используется команда.

13 голосов
/ 15 июня 2012

Как отметил @victor hugo, «правильный» способ - использовать svn copy. Есть одно предостережение, хотя. «Тег», созданный таким образом, не будет истинным тегом, это будет точная копия указанной ревизии, но это будет другая сама ревизия. Так что, если ваша система сборки использует SVN-ревизию каким-то образом (например, включает число, полученное с 'svn info' в версию продукт, который вы создаете), то вы не сможете построить точно такой же продукт из тега (результат будет иметь ревизию тега вместо оригинальный код).

Похоже, что в svn нет способа создать действительно правильный метатег.

12 голосов
/ 18 ноября 2014

Просто используйте это:

svn  copy  http://svn.example.com/project/trunk  
           http://svn.example.com/project/branches/release-1
           -m  "branch for release 1.0"

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

Более подробные сведения об использовании SVN см. В моем блоге: SVN Essentials и SVN Essentials 2

11 голосов
/ 12 мая 2009

Может использовать черепаху:

http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-branchtag.html

7 голосов
/ 10 декабря 2012

@ victor hugo и @unwind верны, и решение Виктора является самым простым. Однако остерегайтесь внешнего в вашем проекте SVN. Если вы ссылаетесь на внешние библиотеки, ссылка на внешнюю ревизию (тег, или HEAD, или номер) останется неизменной, если вы пометите каталоги, имеющие внешние ссылки.

Можно создать сценарий для обработки этого аспекта тегирования. Для обсуждения этой темы см. Эту статью SO: Пометка оформления SVN извне

4 голосов
/ 11 марта 2015

Другой вариант пометить хранилище Subversion - добавить тег к свойству svn: log следующим образом:

   echo "TAG: your_tag_text" > newlog
   svn propget $REPO --revprop -r $tagged_revision >> newlog
   svn propset $REPO --revprop -r $tagged_revision -F newlog
   rm newlog

Я недавно начал думать, что это самый «правильный» способ пометки. Таким образом, вы не создаете дополнительные ревизии (как вы делаете с "svn cp") и все еще можете легко извлечь все теги, используя grep в выводе "svn log":

   svn log | awk '/----/ {
                      expect_rev=1;
                      expect_tag=0;
                  }
                  /^r[[:digit:]]+/ {
                      if(expect_rev) {
                          rev=$1;
                          expect_tag=1;
                          expect_rev=0;
                      }
                  }
                  /^TAG:/ {
                      if(expect_tag) {
                          print "Revision "rev", Tag: "$2;
                      }
                      expect_tag=0;
                  }'

Кроме того, таким образом, вы можете без проблем удалять теги, если вам нужно. Таким образом, теги становятся полной метаинформацией, и мне это нравится.

0 голосов
/ 03 декабря 2018
svn copy http://URL/svn/trukSource http://URL/svn/tagDestination -m "Test tag code" 
  $error[0].Exception | Select-object Data

Все, что вам нужно сделать, изменить путь URL. Эта команда создаст новый каталог "tagDestination". Во второй строке будет дана полная информация об ошибке, если она возникнет. Создайте переменную svn env , если она не создана. Можно проверить (Cmd: - установить, Powershell: - Get-ChildItem Env :) Путь по умолчанию: «C: \ Program Files \ TortoiseSVN \ bin \ TortoiseProc.exe»

0 голосов
/ 11 сентября 2014

Попробуй это. У меня это работает:

mkdir <repos>/tags/Release1.0
svn commit <repos>/tags/Release1.0 
svn copy <repos>/trunk/* <repos>/tag/Release1.0
svn commit <repos/tags/Release1.0 -m "Tagging Release1.0"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...