在svn中如何使用tag,branch,trunk等功能

來源:互聯網
上載者:User
 很久以前,上springsource網站下載源碼和樣本時,經常看到trunk,branch,tag等目錄,當時沒有太注意這裡面的區別,經常一股腦都給下來了。今天講講這幾個東西的區別和應用情境,在SVN中Branch/tag在一個功能選項中,在使用中也往往產生混淆。
        在實現上,branch和tag,對於svn都是使用copy實現的,所以他們在預設的許可權上和一般的目錄沒有區別。至於何時用tag,何時用 branch,完全由人主觀的根據規範和需要來選擇,而不是強制的(比如cvs)。
        一般來說,tag,是用來做一個milestone的,不管是不是release,都是一個可用的版本。這裡,應該是唯讀。更多的是一個顯示用的,給人一個可讀 (readable)的標記。而branch,是用來做並行開發的,這裡的並行是指和trunk進行比較。這樣大家就知道trunk是主線工程了。
        比如,3.0開發完成,這個時候要做一個tag,tag_release_3_0,然後基於這個tag做release,比如安裝程式等。trunk進入 3.1的開發,但是3.0發現了bug,那麼就需要基於tag_release_3_0做一個branch,branch_bugfix_3_0,基於這 個branch進行bugfix,等到bugfix結束,做一個tag,tag_release_3_0_1,然後,根據需要決定 branch_bugfix_3_0是否併入trunk。
        對於svn還要注意的一點,就是它是全域版本號碼,其實這個就是一個tag的標記,所以我們經常可以看到,什麼什麼release,基於xxx項目的 2xxxx版本。就是這個意思了。但是,它還明確的給出一個tag的概念,就是因為這個更加的可讀,畢竟記住tag_release_1_0要比記住一個 很大的版本號碼容易的多。

一種說法:
branches:分枝
        當多個人合作,可能有這樣的情況出現:John突然有個想法,跟原先的設計不太一致,可能是功能的添加或者日誌格式的改進等等,總而言之,這個想法可能需 要花一段時間來完成,而這個過程中,John的一些操作可能會影響Sally的工作,John從現有的狀態單獨出一個project的話,又不能及時得到 Sally對已有代碼做的修正,而且獨立出來的話,John的嘗試成功時,跟原來的合并也存在困難。這時最好的實踐方法是使用branches。 John建立一個自己的branch,然後在裡面實驗,必要的時候從Sally的trunk裡取得更新,或者將自己的階段成果彙集到trunk中。
(svn copy SourceURL/trunk DestinationURL/branchName -m "Creating a private branch of xxxx/trunk." )
trunk:主幹
      主幹,一般來說就是開發的主要呆的地方,
tag:
      在經過了一段時間的開發後,項目到達了一個裡程碑階段,你可能想記錄這一階段的代碼的狀態,那麼你就需要給代碼打上標籤。
(svn cp file:///svnroot/mojavescripts/trunk file:///svnroot/mojavescripts/tags/mirrorutils_rel_0_0_1 -m "taged mirrorutils_rel_0_0_1")

另有一說,無所謂誰對誰錯。
        trunk:表示開發時版本存放的目錄,即在開發階段的代碼都提交到該目錄上。
        branches:表示發布的版本存放的目錄,即項目上線時發布的穩定版本存放在該目錄中。
        tags:表示標籤存放的目錄。
 
        在這需要說明下分三個目錄的原因,如果項目分為一期、二期、三期等,那麼一期上線時的穩定版本就應該在一期完成時將代碼copy到branches上,這 樣二期開發的代碼就對一期的代碼沒有影響,如新增的模組就不會部署到生產環境上。而branches上的穩定的版本就是發布到生產環境上的代碼,如果使用者 使用的過程中發現有bug,則只要在branches上修改該bug,修改完bug後再編譯branches上最新的代碼發布到生產環境即可。tags的 作用是將在branches上修改的bug的代碼合并到trunk上時建立個版本標識,以後branches上修改的bug代碼再合并到trunk上時就 從tags的version到branches最新的version合并到trunk,以保證前期修改的bug代碼不會再合并。

需求一:
有一個客戶想對產品做定製,但是我們並不想修改原有的svn中trunk的代碼。
方法:
用svn建立一個新的branches,從這個branche做為一個新的起點來開發
svn copy svn://server/trunk svn://server/branches/ep -m "init ep"

Tip:
如果你的svn中以前沒有branches這個的目錄,只有trunk這個,你可以用
svn mkdir branches
建立個目錄

需求二:
產品開發已經基本完成,並且通過很嚴格的測試,這時候我們就想發布給客戶使用,發布我們的1.0版本
svn copy svn://server/trunk svn://server/tags/release-1.0 -m "1.0 released"
咦,這個和branches有什麼區別,好像啥區別也沒有?
是的,branches和tags是一樣的,都是目錄,只是我們不會對這個release-1.0的tag做修改了,不再提交了,如果提交那麼就是 branches

需求三:
有一天,突然在trunk下的core中發現一個致命的bug,那麼所有的branches一定也一樣了,該怎麼辦?
svn -r 148:149 merge svn://server/trunk branches/ep
其中148和149是兩次修改的版本號碼。

轉載:http://wolfgangkiefer.blog.163.com/blog/static/8626550320111209363246/

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.