Как правильно создать тег 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"

Ответ 1

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

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

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

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

Ответ 2

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

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"

Ответ 3

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Еще одна возможность пометить репозиторий 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;
                  }'

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

Ответ 8

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: - set, Powershell: - Get-ChildItem Env :) Путь по умолчанию: "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe"

Ответ 9

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

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"