分支,標(biāo)簽,與合并幾乎是所有版本控制系統(tǒng)的基本概念.如果你不熟悉這些功能,我們在這章提供了一個很好
的介紹.如果你非常熟悉了,也能很好的讓你看看Subversion是如何實(shí)現(xiàn)這些功能的.
分支是版本控制的一項(xiàng)基本的功能.如果你將要使用Subversion來管理你的數(shù)據(jù).這是一個特色你將最終依賴
它.這章要求你已經(jīng)對Subversion的基本概念比較熟悉.
什么是分支?
假設(shè)你需要在你的電腦上維護(hù)一份被分離的文檔,一個手冊或是別的什么.某天要求你對同份文檔做一個不同
的修改分離,但分離后他們兩者只有一小部分不同,因此只有輕微的不同.
你將怎么解決這種處境?顯而易見的方法是不是:可以再拷貝這份文檔,然后保存兩個不同的分離版本.當(dāng)某個
部分要進(jìn)行修改時,只要寫入對應(yīng)的文件就可以了.
經(jīng)常需要對兩個拷貝版本進(jìn)行同樣的修改.例如:如果發(fā)現(xiàn)一個打印錯誤在第一個文件里,這也很可能存在第二
個拷貝文件里.這兩個文件是相同的的.
這就是分支的基本概念,一條基于另外一條開發(fā)線存在的分支.并共享在分離之前的日志.一個分支就象一個拷
貝的存在,并從那里離開,并具有自己的歷史.
圖:Figur 4.1. Branches of development
Subversion提供了一些功能來保持文件或目錄分支的平行性.允許通過拷貝數(shù)據(jù)來創(chuàng)建分支,并記錄與源文件
的關(guān)系.也能幫助你將一個分支的修改復(fù)制到另外其他的支流上.總的來說,能夠映射出不同的工作拷貝.這樣
就可以在不同的分支上進(jìn)行工作.
使用分支
圖:Figure 4.2. Starting repository layout
假設(shè)Sally與你同時擁有"calc"項(xiàng)目的工作副本,并都有/calc/trunk的工作副本.所有項(xiàng)目相關(guān)的文件都
在/calc目錄下,因?yàn)槟銈兊膱F(tuán)隊(duì)已經(jīng)商定/calc/trunk用于存放開發(fā)主線.
此時你被要求完成一個任務(wù)就是新增項(xiàng)目的一個基本新特性.這將需要很長的時間來完成,并可能回影響到項(xiàng)
目中的大部分晚間.問題是你不想與Sally有任何沖突,她正在修改項(xiàng)目中的一些存在的小BUG.并依賴于最新發(fā)
布的項(xiàng)目版本,這里(/calc/trunk)主線版本是最有效的.如果你提交修改那么肯定會打亂Sally的修改工作.
一種策略就是進(jìn)入一個空洞:你和Sally在一到兩周內(nèi)停止共享信息.那就是開始獲取整頓在你工作副本的所有
文件,并不做任何提交一直到你完成工作任務(wù).這個方案存在著很多問題,第一,這樣一來做不安全.很多人喜歡
頻繁的將工作結(jié)果上傳到版本庫,已防止工作副本被突發(fā)事件破壞引起的后果.第二,不夠容易.如果你在不同
的機(jī)器上工作,你就需要手工的將工作副本進(jìn)行拷貝修改.最后,當(dāng)你完成你的所有修改后,你將發(fā)現(xiàn)很難將你
的工作合并到主線項(xiàng)目的代碼中去.
更好的解決方法就是創(chuàng),建所有你自己的分支.能頻繁的提交工作在不與其他人的沖突下.也能有選擇性的共享
信息.
創(chuàng)建一個分支
創(chuàng)建一個分支非常簡單-只需要用svn copy命令拷貝項(xiàng)目就可以.Subversion不單支持單文件,也支持整個文件
目錄的分支創(chuàng)建.在此例中,我們要拷貝/calc/trunk文件夾.那么應(yīng)該把拷貝放在那里呢?任何地方你想要放置
的地方.這里需要提到項(xiàng)目的策略在庫中有/calc/branches目錄空間,并你想要拷貝的目錄名重命名為my-
calc-branch.
有兩種不同的方法來進(jìn)行拷貝.首先介紹有些麻煩的方法.只是為了讓概念清晰一點(diǎn).首先,檢出版本庫./calc.
使用svn copy命令拷貝要進(jìn)行分支的文件目錄.
$ cd bigwc
$ svn copy trunk branches/my-calc-branch
$ svn status
A + branches/my-calc-branch
在這個例自立,拷貝命令遞歸拷貝trunk下的文件到新的工作目錄.branches/my-calc-branch.你可以從svn
status 命令,心得目錄被添加版本庫中.同時注意"+"符號前面的字母A.他表明添加的列表是一些數(shù)據(jù)的拷貝,
并不是新添加的版本庫的數(shù)據(jù).當(dāng)年提交修改后,版本庫就會創(chuàng)建/calc/branches/my-calc-branch在版本庫中
通過拷貝/calc/trunk,而不是通過工作副本將數(shù)據(jù)傳送到版本庫.
$ svn commit -m "Creating a private branch of /calc/trunk."
Adding branches/my-calc-branch
Committed revision 341.
現(xiàn)在介紹一種簡單的創(chuàng)建分支的方法,那就是可以通過給svn copy 命令傳入兩個URL路徑來實(shí)現(xiàn).
$ 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.
從版本庫的角度來看,實(shí)際上這兩種方法并無任何區(qū)別.注意區(qū)別只在與本地客戶端,后者可以立即執(zhí)行分支任
務(wù),簡單,并不需要你檢出龐大的工作副本.這種方法是最常用的.
圖 4.3. Repository with new copy
廉價的拷貝
Subversion的庫經(jīng)過特別的設(shè)計.當(dāng)你拷貝一個文件目錄是,你不需要擔(dān)心會占用大量的版本庫容量-實(shí)際上版
本庫并不會真正的拷貝數(shù)據(jù).取而代之的是建立一個新的目錄路口來指向已存在的目錄樹.如果你是UNIX的用
戶,這與磁盤連接的概念是相同的.后面對文件或是目錄的修改也是影響被拷貝文件目錄.任何能夠使用該概念
的地方Subversion都會利用該理念.
這也是為什么聽到廉價拷貝這個詞.我們不需要擔(dān)心文件目錄有多大-拷貝的花費(fèi)都是非常微小的.這種特性也
是每次提交所做的事,每個版本都是一次廉價拷貝.除了很少的一點(diǎn)修改數(shù)據(jù)進(jìn)行保存.
當(dāng)然,這些機(jī)制或數(shù)據(jù)共享對于用戶都是隱藏不可見的.我們能簡單的看到拷貝目錄.主要點(diǎn)就是拷貝是非常廉
價的,無論是時間還是空間.如果你用這種方法拷貝是非常快的.當(dāng)然可以隨心所欲的進(jìn)行分支.
使用分支進(jìn)行工作
現(xiàn)在我們建立了項(xiàng)目的一個份支,我們就可以檢出該分支并開始工作使用它.
$ 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.
這個工作副本并無任何特別之處;只是簡單鏡像了一個庫中項(xiàng)目.當(dāng)你提交修改后,Sally并不期望當(dāng)她更新工
作副本的時候看到這些修改.因?yàn)樗墓ぷ鞲北臼?calc/trunk.
讓我們假設(shè)看看一個星期里所發(fā)生的事
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.
現(xiàn)在這里有兩條獨(dú)立的開發(fā)線
圖Figure 4.4. The branching of one file's history
分支背后的關(guān)鍵概念
這里有兩點(diǎn)重要的內(nèi)容需要在這里記住.第一,Subversion并沒有沖突分支的概念-它只知道怎么去進(jìn)行拷貝.
當(dāng)你拷貝一個目錄是,結(jié)果就是目錄是一個獨(dú)立的分支.你可能回想像一個不同的目錄被建立或被處理.但對于
Subversion只是平常的目錄控制區(qū)別只是再擴(kuò)展一個歷史日志信息.第二,因?yàn)檫@種拷貝機(jī)制,Subversion的分
支只是平常的存儲在版本庫中,而不像其他的版本控制系統(tǒng),分支是真正存儲了目錄文件.
注意,Subversion并不支持不同版本庫之間拷貝也使用映射機(jī)制,所以他只能在同版本庫下工作.