2011-05-08 20 views
6

這個問題移動標籤可以作爲被改寫。如何在SVN

一個簡單的問題,但我無法自己滿意地解決。

該概念來自其他SCM工具,您只需將標籤移動到不同的修訂版上,然後將其「粘貼」到您所需的確切修訂版。那些其他的工具對標籤是什麼都有本質的理解,SVN將所有東西都推廣爲複製分支。

回答以下問題,我看到的其他論壇和帖子在此相同,因此已經考慮並拒絕:

  1. 這是不正確使用SVN 的
    • 其實,SVN是設計爲通用,並完成許多使用模式
    • 這是一個尋找答案的使命。我理解這些挑戰,以及從未找到答案的可能性。也許我會切換到一個不同的工具。
  2. 爲什麼你使用SVN這樣我們,所以最好這樣做和那個。
    • 有許多可以採用的使用模式或SCM模型。在我的情況下, 具體爲:
      • Trunk表示正在進行的開發,並且將小補丁應用於此。
      • 生產是一個單一的TAG
      • 從開發轉向是非常短暫和積極的,因此我們不能 與幾個完整的生產版本一起工作。這意味着我不可能每次都爲生產中部署的每個小變更創建一個新的標籤 。
      • 因此總之,「我的場景中不存在」完整的包裝生產版本「。
    • 這是我需要的用例場景。

好了,我不會冒昧,我會讀每一個提供單一解決方案,並根據需要重新考慮。

+1

如果我這樣做是正確,你要合併做一個幹線文件的變化,變成了分支路徑?您希望這與SVN中的標準合併有什麼不同? – Groo 2011-05-08 19:34:35

+1

所以你在任何時候只有一個標籤?沒有技術上的原因,這是行不通的,但不是標籤通常如何工作。每當你發佈一個版本的時候,你可能會想用版本號(如1.0),並對其進行標記,然後,如果你需要釋放微微一變的版本,使*新*標籤叫1.0.1。然後你可以有另一個標籤叫做「latest」或者總是有你最新版本的東西。 – MatrixFrog 2011-05-08 20:42:06

+0

我有同樣的問題。你怎麼「動」的標記,也就是說,如果你已經通過複製可以說標籤/ 1.5.0標記你的頭,那你意識到你需要更新一個文件,它包含與此標記的版本,這將成爲發行。你不能創建一個新的標籤,因爲它必須是「1.5.0」。我們需要爲一個文件的新版本添加標籤,這種舊版本的版本過於粗糙。這在SVN中似乎不可能。如果您嘗試將新版本複製到相同的標籤,它會抱怨它已經存在。我們不能將標籤「簽出」到一個新目錄中,因爲回購太大。 – 2013-04-10 09:27:23

回答

3

標籤和分支在SVN中沒有區別。所有不同之處在於團隊遵循的有關如何使用標籤和分支的政策。

因此,您可以將更改合併到標記中,並按照與分支一樣的方式提交新修訂。可以理解的是,通常你不想這樣做,以便「標記」你用於發佈的文件的確切版本。但如果真的需要,你可以從這條規則中例外一次。

或者,您可以刪除標籤,然後使用正確的修訂版重新創建標籤。

的幾個環節,以SVN書:「Tags」,「Branch Maintenance


新增:所以,它聽起來,這樣的重新標記不是一種罕見的,非典型的用例,而是有規律在你的團隊練習。似乎標籤中不僅僅給出了文件特定快照的名稱,而且希望該名稱能夠跟隨文件的後續更新,而忘記了之前的位置。此外,你似乎發現你的工作流程不方便。

嗯,我不認爲有一個簡單和乾淨的方式來實現你想要的SVN。在我看來,最好「擁抱」分支機構並學習如何有效地使用它們。

+0

是的,我考慮過的所有內容:合併到標籤中,或重新創建標籤。問題在於,將單個文件投入生產的人數很複雜。我真的需要一個簡單的動作,讓我能夠選出一個文件,然後將其合併到生產標籤中。 – YoYo 2011-05-08 20:31:41

+1

我認爲你可以'svn switch'到標籤,獲取文件(從中繼或任何地方),並將其放入你的工作副本,然後'svn commit'改變。然後將'svn switch'切換回主幹,以確保您不會意外地將屬於幹線的新開發交付給標籤。 – MatrixFrog 2011-05-08 20:39:30

1

對@Alexey Kukanov的回答的評論表明,你真正想要的是一個分支,而不是一個標籤。標籤是一個單一的,不變的時間點的歷史記錄。分支是代碼的副本,隨着時間的推移將會進一步發生變化。你在談論後者。標準做法是爲每個支持的版本創建「bugfix」或「production」分支,並直接在分支上提交更改[1]或將其與主幹合併。

在這種情況下,標籤將用於創建分支的「副本」以指示「該代碼恰好在該特定時間正在生產」。因此,如果需要,您可以輕鬆地返回並與之比較。

[1] ...後來他們合併

2

我已經找到1層簡單的方法來做到這一點適當的後備箱使用烏龜SVN(即移動標籤的文件)。

  1. 通過右鍵單擊瀏覽回購您的簽出的項目目錄,並選擇「龜SVN->回購瀏覽器」
  2. 導航到你希望將自己的代碼中改變文件/目錄
  3. 右鍵點擊在文件上並選擇「結帳」。
  4. 在您的HD上選擇一個臨時目錄並點擊確定。
  5. 使用更新後的版本覆蓋此文件(使用本地文件傳播程序,而不是SVN回購瀏覽器)
  6. 右鍵單擊該文件並選擇「SVN checkin」。

工作完成。

要使用CVS是微不足道的做同樣的事情,只是去到所需的目錄,然後鍵入: 「CVS標籤-F標記名文件名」 SVN並不真正具有標籤,這使得它痛苦的使用(在我看來) 。

不知道爲什麼這會被拒絕投票 - 這是我們如何解決在問題中設置的確切問題。

+0

這正是我尋找的缺失步驟。你只是想做一個合併,但爲了這樣做,你必須先退房到其他位置。順便說一句,如果更改是您已經在標籤後面簽入的內容,那麼您可以在步驟5中進行適當的合併。 – usethe4ce 2013-10-02 06:17:38

2

Subversion中的標籤和分支實際上只是目錄。它們的概念並不嵌入在Subversion中,而是嵌入在你的大腦中。

正如其他人所說的,標籤是在特定時間點存儲庫的快照,不應該改變。如果你打算改變一個標籤,它應該是一個分支。

例如,

  • 我想展示的批准變化的標籤:使它成爲一個分支,而不是一個標籤。
  • 我想表明哪些文件已被用於最後的構建:同上。
  • 我想表明什麼樣的代碼進行了審查:同上。

但這些都不是分支! 抱怨 要求。

很好,一個倉庫的建議結構就是:一個建議。你可以添加其他目錄之外trunktagsbranches這些移動標籤

$repo/trunk 
$repo/branches 
$repo/tags 
$repo/moveable_tags 

現在,你可以把你下 moveable_tags改變標籤,而且人們使用的版本標籤,快照等標籤

我在我工作的一個位置之前修改建議的版本庫佈局。我想從存儲庫中刪除過時的分支和標籤,但管理層和開發人員提出異議。

我說刪除這些並沒有從資源庫中刪除。如果需要,我可以很容易地找回它們,但通過刪除它們,我可以從這兩個目錄中消除大量不必要的混亂。但是,開發人員對此感到不安。當然,我可以找到他們,但他們可以嗎?

取而代之,我在trunk,tagsbranches目錄級別添加了obsolete/tagsobsolete/branches目錄。我沒有刪除過時的標籤和分支,而只是移動它們。 tagsbranches沒有混亂,經理和開發人員感覺更好,他們知道如果他們需要它們,他們就會找到這些過時的分支和標籤。


假設你沒有對標籤做任何事情。您使用標籤作爲快照,任何您希望更改和更新的內容都是分支。有時候標籤可能需要更改。

而且,Subversion比其他大多數版本控制系統更好地處理這個問題。這是因爲標籤包含其創建和更改的整個歷史。在大多數其他版本控制系統中,如果標籤的歷史完全保留,那麼該標籤的歷史就是二級公民。你可以看到標籤。您可以看到該標籤下有哪些文件和版本,但您無法看到誰創建了該標籤以及該標籤是如何更改的。在Subversion下,標籤包含它們的整個歷史。

要在標籤的變化:

  • 檢查出的標籤。
  • 進行更改。
  • 提交您的更改。

,或者甚至更好,使用svn cpsvn 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主幹更新。

0

我還需要做的某個時候。你做你從標籤,而不是分支(:// blahblah /標籤/ mytag,沒有SVN:所以像SVN // blahblah /分支機構/ mybranch)檢查出什麼你的svn文件,然後你提交更改的文件在那裏,它會有更新的標籤。