版本控制系統的功能之一是能夠將變更隔離到獨立的開發線上。這條線稱為分支。分支通常用於嘗試新功能,而不會因編譯器錯誤和錯誤而干擾主要的開發線。一旦新功能足夠穩定,開發分支就會合併回主分支(主幹)。
版本控制系統的另一個功能是能夠標記特定的修訂版本(例如,發布版本),以便您可以隨時重建特定的建置或環境。此過程稱為標籤。
Subversion 沒有用於分支或標籤的特殊命令,而是使用所謂的“廉價副本”來代替。廉價副本類似於 Unix 中的硬連結,這表示它不是在儲存庫中建立完整副本,而是建立一個指向特定樹狀結構/修訂版本的內部連結。因此,分支和標籤的建立速度非常快,並且幾乎不佔用儲存庫中的額外空間。
如果您已使用建議的目錄結構匯入專案,則建立分支或標籤版本非常簡單
在您的工作副本中選擇您要複製到分支或標籤的資料夾,然後選擇命令 → 。
新分支的預設目標 URL 將是您的工作副本所依據的來源 URL。您需要將該 URL 編輯為分支/標籤的新路徑。所以取代
https://svn.example.com/repos/ProjectName/trunk
您現在可能會使用類似於
https://svn.example.com/repos/ProjectName/tags/Release_1.10
如果您不記得上次使用的命名慣例,請點擊右側的按鈕開啟儲存庫瀏覽器,以便您可以查看現有的儲存庫結構。
當您指定目標 URL 時,直到最後一個資料夾的所有資料夾都必須已存在,否則您會收到錯誤訊息。在上面的範例中,必須存在 URL https://svn.example.com/repos/ProjectName/tags/
才能建立 Release_1.10
標籤。
但是,如果您要建立分支/標籤到具有尚不存在的中繼資料夾的 URL,您可以勾選對話方塊底部的 建立中繼資料夾
選項。如果啟用該選項,則會自動建立所有中繼資料夾。
請注意,預設情況下會停用此選項,以避免拼字錯誤。例如,如果您將目標 URL 輸入為 https://svn.example.com/repos/ProjectName/Tags/Release_1.10
而不是 https://svn.example.com/repos/ProjectName/tags/Release_1.10
,則在停用該選項的情況下您會收到錯誤,但在啟用該選項的情況下,會自動建立一個名為 Tags
的資料夾,並且您最終會得到一個 Tags
資料夾和一個 tags
資料夾。
現在您必須選擇副本的來源。在這裡您有三個選項
新分支直接從 HEAD 修訂版本在儲存庫中複製。無需從您的工作副本傳輸任何資料,並且分支建立速度非常快。
新分支直接在儲存庫中複製,但您可以選擇較舊的修訂版本。如果您忘記在上週發布專案時建立標籤,這會很有用。如果您不記得修訂版本號碼,請點擊右側的按鈕以顯示修訂記錄,然後從那裡選擇修訂版本號碼。同樣,不會從您的工作副本傳輸任何資料,並且分支建立速度非常快。
新分支是您本機工作副本的完全相同的副本。如果您已將某些檔案更新為 WC 中的較舊修訂版本,或者如果您已進行本機變更,那正是複製的內容。如果您的 WC 中已存在資料,則這種複雜的標籤自然可能涉及將資料從您的 WC 傳輸回儲存庫。
如果您希望將您的工作副本自動切換到新建立的分支,請使用將工作副本切換到新分支/標籤核取方塊。但是,如果您這樣做,請先確保您的工作副本不包含修改。如果包含修改,則在您切換時,這些變更將合併到分支 WC 中。
如果您的工作副本包含使用 svn:externals
屬性包含的其他專案,則這些外部項目將在分支/標籤對話方塊的底部列出。對於每個外部項目,都會顯示目標路徑和來源 URL。
如果您要確保新標籤始終處於一致的狀態,請檢查所有外部項目是否已釘選其修訂版本。如果您不檢查外部項目,並且這些外部項目指向未來可能會變更的 HEAD 修訂版本,則簽出新標籤將簽出該外部項目的 HEAD 修訂版本,並且您的標籤可能無法再編譯。因此,在建立標籤時,始終最好將外部項目設定為明確的修訂版本。
外部項目會根據分支/標籤的來源自動釘選到目前的 HEAD 修訂版本或工作副本 BASE 修訂版本
表 4.1. 釘選的修訂版本
複製來源 | 釘選的修訂版本 |
---|---|
儲存庫中的 HEAD 修訂版本 | 外部項目的儲存庫 HEAD 修訂版本 |
儲存庫中的特定修訂版本 | 外部項目的儲存庫 HEAD 修訂版本 |
工作副本 | 外部項目的 WC BASE 修訂版本 |
如果作為外部項目包含的專案本身包含外部項目,則這些外部項目將不會被標記!只能標記作為直接子項的外部項目。
按下 儲存庫內部建立的。
將新副本提交到儲存庫。別忘了提供日誌訊息。請注意,副本是在請注意,除非您選擇將工作副本切換到新建立的分支,否則建立分支或標籤不會影響您的工作副本。即使您從您的 WC 建立分支,這些變更也會提交到新分支,而不是主幹,因此您的 WC 相對於主幹可能仍標記為已修改。
您也可以在沒有工作副本的情況下建立分支或標籤。若要執行此操作,請開啟儲存庫瀏覽器。您可以在那裡將資料夾拖曳到新位置。您必須在拖曳時按住 Ctrl 鍵才能建立副本,否則資料夾會被移動,而不是複製。
您也可以使用滑鼠右鍵拖曳資料夾。一旦您放開滑鼠按鈕,您可以從上下文選單中選擇您要移動還是複製資料夾。當然,若要建立分支或標籤,您必須複製資料夾,而不是移動它。
另一種方法是從日誌對話方塊。您可以顯示例如主幹的日誌對話方塊,選擇一個修訂版本(最頂部的 HEAD 修訂版本或較早的修訂版本),按一下滑鼠右鍵並選擇
。...這(其實)不是問題。當簽出從儲存庫中的所需分支下載所有內容到您的工作目錄時,
→ 僅將變更的資料傳輸到您的工作副本。對網路負載有利,對您的耐心也有利。 :-)為了能夠使用您新產生的分支或標籤,您有幾種處理方法。您可以
→ 在空的資料夾中建立全新的簽出。您可以簽出到本機磁碟上的任何位置,並且您可以從儲存庫建立任意數量的的工作副本。
將您目前的工作副本切換到儲存庫中新建立的副本。再次選擇專案的頂層資料夾,然後從上下文選單中使用
→ 。在下一個對話方塊中,輸入您剛才建立的分支的 URL。選擇Head 修訂版本單選按鈕,然後點擊 。您的工作副本已切換到新的分支/標籤。
切換的工作方式與更新類似,它永遠不會捨棄您的本機變更。當您執行切換時,您對工作副本所做的任何尚未提交的變更都將被合併。如果您不希望發生這種情況,則必須在切換之前提交變更,或將工作副本還原為已提交的修訂版本(通常為 HEAD)。
如果您想在主幹和分支上工作,但不希望產生全新簽出的費用,您可以使用 Windows 檔案總管在另一個資料夾中建立主幹簽出的副本,然後將該副本
→ 到您的新分支。
雖然 Subversion 本身不區分標籤和分支,但它們的典型使用方式略有不同。
標籤通常用於建立專案在特定階段的靜態快照。因此,它們通常不用於開發 - 那是分支的用途,這也是我們首先建議使用 /trunk /branches /tags
儲存庫結構的原因。在標籤修訂版本上工作不是一個好主意,但由於您的本機檔案未受寫保護,因此沒有什麼可以阻止您錯誤地執行此操作。但是,如果您嘗試提交到儲存庫中包含 /tags/
的路徑,TortoiseSVN 會警告您。
您可能需要對已標記的發行版本進行進一步的變更。處理此問題的正確方法是首先從標籤建立一個新分支並提交該分支。在這個分支上進行您的變更,然後從這個新分支建立一個新標籤,例如 Version_1.0.1
。
如果您修改從分支建立的工作副本並提交,則所有變更都會進入新分支,而不是主幹。僅儲存修改。其餘部分仍然是廉價副本。