Як правильно створити тег SVN із стовбура?


282

Я створюю свій перший проект у 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"

10
На жаль, я не роблю всіх варіантів у цьому випадку ... git - це досить чортова магія.
ojblass

Відповіді:


186

Ви правильні в тому, що не правильно "додавати файли в папку з тегами".

Ви правильно здогадалися, яку copyоперацію слід використовувати; це дозволяє Subversion відслідковувати історію цих файлів, а також (я припускаю) зберігати їх набагато ефективніше.

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

У цій частині "книги" показано, як зазвичай використовується команда.


15
1.1 версія книги страшенно застаріла. Ось краще посилання: svnbook.red-bean.com/nightly/en/svn.branchmerge.tags.html
Квінн Тейлор

1
Файли, скопійовані, не витрачають зайвого місця
Карлос,

424

Використання:

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"

36
Я позначив це як відповідь. Всього одна додаткова записка. Ви можете отримати попередню редакцію магістралі та "тегнути" її також. команда: svn copy -r 123 " svn.example.com/project/trunk " " svn.example.com/project/tags/1.0 " -m "Позначення тегами, але з використанням старішої версії (123)."
granadaCoder

7
Я отримую svn: Локальні операції, які не приймають комісії, не приймають повідомлення журналу чи властивості перегляду , тому я просто видаляю опцію -m.
Джоні

4
Просто FYI, переконайтеся, що ваша URL-адреса відповідає вашому сховищу, включаючи http або https.
Норман Н

2
Чому \ в кінці першого рядка?
Fractaliste

1
@Jonny Я не можу запустити вищевказану команду без параметра "-m". Я використовую термінал на Mac.
Абдуррахман Мубін Алі

14

Як зазначає @victor hugo, "правильним" способом є використання копії svn. Хоча є один застереження. Створений таким чином "тег" не буде істинним тегом, він буде точною копією зазначеної версії, але це буде сама інша редакція. Отже, якщо ваша система побудови якось використовує редагування svn (наприклад, включає число, отримане зі "svn info", у версію продукту, який ви створюєте), ви не зможете побудувати точно такий же продукт із тегу ( У результаті буде переглянуто тег замість оригінального коду).

Схоже, що в дизайні немає можливості у svn створити справді правильний метатег.


4
Можливо скористатися "Останньо зміненою версією": echo "{ 'svnRev': \"`svn info | awk '/Last Changed Rev:/{print $4}'`\" }" >svnver.txt`
18446744073709551615

Таким чином, дві гілки з (звичайно) різними номерами редакції все ще виробляють одну і ту ж версію програмного забезпечення.
18446744073709551615

1
Так, ви маєте рацію щодо Last Changed Rev, але це не змінює факту, що в дизайні немає реальних тегів у Subversion.
Олександр Амелькін

@ 18446744073709551615: Ви можете уникнути використання awkта отримання цієї інформації прямо з svn, скориставшись --show-itemопцією:svn info --show-item last-changed-revision
Luchostein

12

Просто скористайтеся цим:

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


Чи можете ви пояснити, як це має виглядати, якщо я лише чекопут із магістралі, і я всередині свого сценарію.
aholbreich

Якщо ви перевірили папку магістралі, вам потрібно скористатися http-адресою сховища. Я оновив відповідь, щоб представити це, оскільки рекомендується перевірити папку стволів.
AgilePro

Чим ця відповідь відрізняється від прийнятої?
Даніель В.

11

Можна використовувати черепаху:

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


1
Я збираюся над цим створити більшу систему, тому мені потрібно зосередитися на основних функціях, що надаються.
ojblass

2
Дякую! Командний рядок може бути правильним, але це було більш корисно.
Ray301

7

@victor hugo і @unwind є правильними, а рішення перемоги - це найпростіше. Однак ОБЕРЕЖУЙТЕ про зовнішніх джерел у вашому проекті SVN. Якщо ви посилаєтесь на зовнішні бібліотеки, посилання на зовнішню редакцію (будь-який тег чи HEAD чи номер) залишиться незмінним, коли ви позначаєте теги на каталоги, які мають зовнішні посилання.

Можна створити скрипт для обробки цього аспекту тегування, для обговорення на цю тему дивіться цю статтю ТА : Тег SVN-каси з зовнішніми сторонами


5

Ще один варіант тегування сховища 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
svn copy http://URL/svn/trukSource http://URL/svn/tagDestination -m "Test tag code" 
  $error[0].Exception | Select-object Data

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


-4

Спробуйте це. Це працює для мене:

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"

1
Це, безумовно, неправильний шлях. Тег (Release1.0) повинен бути копією вихідного каталогу (магістралі), а не довільно створеним каталогом. Якщо ви робите це так, як ви робили, ви втрачаєте історію самого вихідного каталогу та зберігаєте лише історію нащадкових вузлів (файлів та каталогів).
Олександр Амелькін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.