1. 程式人生 > >透徹的解釋了svn copy 的工作原理-強力推薦

透徹的解釋了svn copy 的工作原理-強力推薦

節選了《51cto.com》文章原始網址:http://developer.51cto.com/art/201005/202665.htm

SVN分支資深專家專題講解        本節向大家介紹一下什麼是SVN分支,如何使用SVN分支,如何建立SVN分支,如何進行廉價的拷貝,對於這些問題本節會給你一一解答,歡迎大家一起來學習關於SVN分支的知識。 1、概述
 分支,標籤,與合併幾乎是所有版本控制系統的基本概念.如果你不熟悉這些功能,我們在這章提供了一個很好的介紹.如果你非常熟悉了,也能很好的讓你看看Subversion是如何實現這些功能的.
       分支是版本控制的一項基本的功能.如果你將要使用Subversion來管理你的資料.這是一個特色你將最終依賴它.這篇文章要求你已經對Subversion的基本概念比較熟悉.
2、什麼是SVN分支?
 假設你需要在你的電腦上維護一份被分離的文件,一個手冊或是別的什麼.某天要求你對同份文件做一個不同的修改分離,但分離後他們兩者只有一小部分不同,因此只有輕微的不同。你將怎麼解決這種處境?顯而易見的方法是:可以再拷貝這份文件,然後儲存兩個不同的分離版本.當某個部分要進行修改時,只要寫入對應的檔案就可以了。經常需要對兩個拷貝版本進行同樣的修改.例如:如果發現一個列印錯誤在第一個檔案裡,這也很可能存在第二個拷貝檔案裡。因為這兩個檔案是相同的.
       這就是分支的基本概念,一條基於另外一條開發線存在的分支.並共享在分離之前的日誌.一個分支就象一個拷貝的存在,並從那裡離開,並具有自己的歷史.

       針對這樣的需求Subversion便提供了一些功能來保持檔案或目錄分支的平行性.允許通過拷貝資料來建立分支,並記錄與原始檔的關係.也能幫助你將一個分支的修改複製到另外其他的支流上.總的來說,能夠映射出不同的工作拷貝.這樣就可以在不同的分支上進行工作.
3、使用SVN分支
       假設Sally與你同時擁有"calc"專案的工作副本,並都有/calc/trunk的工作副本.所有專案相關的檔案都在/calc目錄下,因為你們的團隊已經商定/calc/trunk用於存放開發主線.
       此時你被要求完成一個任務就是新增專案的一個基本新特性.這將需要很長的時間來完成,並可能回影響到專案中的大部分檔案.問題是你不想與Sally有任何衝突,她正在修改專案中的一些存在的小BUG.並依賴於最新發布的專案版本,這裡(/calc/trunk)主線版本是最有效的.如果你提交修改那麼肯定會打亂Sally的修改工作.一種策略就是進入一個空洞:你和Sally在一到兩週內停止共享資訊.那就是獲取一份主線版本的工作副本
,並寫在你修改的功能結束以前不做任何提交,直到你完成工作任務再盡心提交.這個方案存在著很多問題,第一,這樣做很不安全.很多人喜歡頻繁的將工作結果上傳到版本庫,以防止工作副本被突發事件破壞引起的後果.第二,不夠容易.如果你在不同的機器上工作,你就需要手工的將工作副本進行拷貝修改.最後,當你完成你的所有修改後,你將發現很難將你的工作合併到主線專案的程式碼中去.更好的解決方法就是建立你自己的分支.這樣就能在不與其他人的衝突的前提下,頻繁的提交工作,也能有選擇性的共享資訊。

4、建立一個SVN分支
       建立一個分支非常簡單-只需要用svn copy命令拷貝專案就可以完成建立. Subversion不單支援單檔案,也支援整個檔案目錄的分支建立.在此例中,我們要拷貝/calc/trunk資料夾.那麼應該把拷貝放在那裡呢?任何地方你想要放置的地方.這裡需要提到專案的策略在庫中有/calc/branches目錄空間,並且你想要拷貝的目錄名重新命名為my-calc-branch.
有兩種不同的方法來進行拷貝。 方法一:首先介紹有些麻煩的方法。只是為了讓概念清晰一點.首先,檢出一份版本庫./calc到本地工作目錄work/calc/。先進入本地工作目錄:
$ cd calc/
$ svn copy trunk branches/my-calc-branch
$ svn status
A  +   branches/my-calc-branch
在這個例子裡,拷貝命令遞迴拷貝trunk下的檔案到新的工作目錄branches/my-calc-branch下。使用svn status 命令,可以看到新的目錄被新增到了版本庫中。同時注意"+"符號前面的字母A.它表明新增的列表是一些資料的拷貝,並不是新新增的版本庫的資料。 之後需要你提交修改後版本庫才能完成分支的建立。
$ svn commit -m "Creating a private branch of /calc/trunk."
Adding         branches/my-calc-branch
Committed revision 341.

方法二:現在介紹一種簡單的建立分支的方法,那就是可以通過給svn copy 命令傳入兩個URL路徑來實現.
$ svn copy http://svn.example.com/repos/calc/trunk \
           http://svn.example.com/repos/calc/branches/my-calc-branch \
      -m "Creating a private branch of /calc/trunk."
Committed revision 341.
從版本庫的角度來看,實際上這兩種方法並無任何區別。唯一的區別只在於前者是在本地客戶端進行操作,後者可以立即執行SVN分支任務,簡單,並不需要你檢出龐大的工作副本。後者的方法是最常用的。 5、廉價的拷貝——如何使用分支程式碼?使用SVN分支進行工作,建立了專案的一個分支之後,我們就可以檢出該分支並開始工作使用它。
$ svn checkout http://svn.example.com/repos/calc/branches/my-calc-branch
A  my-calc-branch/Makefile
A  my-calc-branch/integer.c
A  my-calc-branch/button.c
Checked out revision 341.
這個工作副本並無任何特別之處;只是簡單映象了一個庫中專案.當你提交修改後,Sally並不期望當她更新工作副本的時候看到這些修改,因為她的工作副本是/calc/trunk。讓我們假設看看一個星期裡所發生的事:      You make a change to /calc/branches/my-calc-branch/button.c, which creates revision 342.      You make a change to /calc/branches/my-calc-branch/integer.c, which creates revision 343.      Sally makes a change to /calc/trunk/integer.c, which creates revision 344.現在這裡出現了兩條獨立的開發線。