Subversion中的標籤和分支實際上只是目錄。它們的概念並不嵌入在Subversion中,而是嵌入在你的大腦中。
正如其他人所說的,標籤是在特定時間點存儲庫的快照,不應該改變。如果你打算改變一個標籤,它應該是一個分支。
例如,
- 我想展示的批准變化的標籤:使它成爲一個分支,而不是一個標籤。
- 我想表明哪些文件已被用於最後的構建:同上。
- 我想表明什麼樣的代碼進行了審查:同上。
但這些都不是分支!你
抱怨
要求。
很好,一個倉庫的建議結構就是:一個建議。你可以添加其他目錄之外trunk
,tags
和branches
這些移動標籤:
$repo/trunk
$repo/branches
$repo/tags
$repo/moveable_tags
現在,你可以把你下 moveable_tags改變標籤,而且人們使用的版本標籤,快照等標籤。
我在我工作的一個位置之前修改建議的版本庫佈局。我想從存儲庫中刪除過時的分支和標籤,但管理層和開發人員提出異議。
我說刪除這些並沒有從資源庫中刪除。如果需要,我可以很容易地找回它們,但通過刪除它們,我可以從這兩個目錄中消除大量不必要的混亂。但是,開發人員對此感到不安。當然,我可以找到他們,但他們可以嗎?
取而代之,我在trunk
,tags
和branches
目錄級別添加了obsolete/tags
和obsolete/branches
目錄。我沒有刪除過時的標籤和分支,而只是移動它們。 tags
和branches
沒有混亂,經理和開發人員感覺更好,他們知道如果他們需要它們,他們就會找到這些過時的分支和標籤。
假設你沒有對標籤做任何事情。您使用標籤作爲快照,任何您希望更改和更新的內容都是分支。有時候標籤可能需要更改。
而且,Subversion比其他大多數版本控制系統更好地處理這個問題。這是因爲標籤包含其創建和更改的整個歷史。在大多數其他版本控制系統中,如果標籤的歷史完全保留,那麼該標籤的歷史就是二級公民。你可以看到標籤。您可以看到該標籤下有哪些文件和版本,但您無法看到誰創建了該標籤以及該標籤是如何更改的。在Subversion下,標籤包含它們的整個歷史。
要在標籤的變化:
,或者甚至更好,使用svn cp
,svn mv
,或svn delete
對庫的URL,而不是針對一個工作目錄。例如,我爲2.0版創建了一個標籤。突然之間,我們意識到我們忘記了這個版本中正在發生的一個非常重要的變化。取而代之的是結賬的,你這樣做:
$ svn cp -r 23933 -m"This change in this file should have been included in the tag" \
$repo/trunk/foo/src/foo.java $repo/tags/2.0/foo/src/foo.java
當你看到這個標記的歷史,你現在會看到的。
$svn log -v $repo/tags/2.0
------------------------------------------------------------------------
r23945 | david | 2013-04-03 11:21:55 -0400 (Wed, 3 Apr 2013) | xxx lines
Changed paths:
M /tags/2.0/foo/src/foo.java (from /trunk/foo/src/foo.java:23933)
This change in this file should have been included in the tag
------------------------------------------------------------------------
r23932 | david | 2013-04-10 11:18:40 -0400 (Wed, 10 Apr 2013) | 1 line
Changed paths:
A /tags/2.0 (from /trunk:23921)
Created release 2.0
我看到該標籤是在一個星期前從主幹上修訂版23921創建的。然後,我看到文件foo.java
了一個星期後,從版本23933主幹更新。
如果我這樣做是正確,你要合併做一個幹線文件的變化,變成了分支路徑?您希望這與SVN中的標準合併有什麼不同? – Groo 2011-05-08 19:34:35
所以你在任何時候只有一個標籤?沒有技術上的原因,這是行不通的,但不是標籤通常如何工作。每當你發佈一個版本的時候,你可能會想用版本號(如1.0),並對其進行標記,然後,如果你需要釋放微微一變的版本,使*新*標籤叫1.0.1。然後你可以有另一個標籤叫做「latest」或者總是有你最新版本的東西。 – MatrixFrog 2011-05-08 20:42:06
我有同樣的問題。你怎麼「動」的標記,也就是說,如果你已經通過複製可以說標籤/ 1.5.0標記你的頭,那你意識到你需要更新一個文件,它包含與此標記的版本,這將成爲發行。你不能創建一個新的標籤,因爲它必須是「1.5.0」。我們需要爲一個文件的新版本添加標籤,這種舊版本的版本過於粗糙。這在SVN中似乎不可能。如果您嘗試將新版本複製到相同的標籤,它會抱怨它已經存在。我們不能將標籤「簽出」到一個新目錄中,因爲回購太大。 – 2013-04-10 09:27:23