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



Я создаю свой первый проект в 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 для отдельных файлов?



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 для всего каталога?



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

8 ответов:

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

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

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

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

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

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"

Как отметил @victor hugo," правильный " способ-использовать копию svn. Однако есть один нюанс. "Тег", созданный таким образом, не будет истинным тегом, это будет точная копия указанной редакции, но это будет другой сама редакция. Поэтому, если ваша система сборки каким-то образом использует ревизию svn (например, включает номер, полученный с помощью "svn info" в версию продукт, который вы создаете), то вы не сможете построить точно такой же продукт из тега (результат будет пересмотр тег вместо оригинальный код.)

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

может использовать Черепаха:

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

просто использовать это:

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

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

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

другой вариант пометить репозиторий 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=;
                          expect_tag=1;
                          expect_rev=0;
                      }
                  }
                  /^TAG:/ {
                      if(expect_tag) {
                          print "Revision "rev", Tag: ";
                      }
                      expect_tag=0;
                  }'

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

попробуйте это. Это работает для меня:

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"

Comments

    Ничего не найдено.