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

Я создаю свой первый проект в в 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"

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 copy. Однако есть одно предостережение. "Тег", созданный таким образом, не будет истинным тегом, это будет точная копия указанной редакции, но это будет другой сама редакция. Поэтому, если ваша система сборки каким-то образом использует ревизию svn (например, включает номер, полученный с помощью "svn info" в версию продукт, который вы создаете), тогда вы не сможете построить точно такой же продукт из тега (результат будет пересмотр тег вместо оригинальный код.)

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



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

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. Если вы ссылаетесь на внешние библиотеки, ссылка на внешнюю ревизию (будь то тег, или HEAD, или number) останется неизменной при тегировании каталогов, имеющих внешние ссылки.

можно создать скрипт для обработки этого аспекта тегирования, для обсуждения этой темы см. Эту статью 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"