在開源軟件領域,并行版本系統(CVS)一直使版本控制的選擇。恰如其分的是,CVS本身是一個自由軟件,它的非限制性的技法和對網絡操作的支持(允許大量的不同地域分散的程序員可以共享他們工作的特性)非常符合開源軟件領域合作的精神,CVS和它半混亂狀態的開發模型成為了開源文化的基石。
但是像許多其他工具一樣,CVS開始顯露出衰老的跡象。Subversion是一個被設計成為CVS繼任者的新版本控制系統。設計者通過兩個辦法來爭取現有的CVS用戶:使用它構件一個開源軟件系統的版本控制過程,從感覺和體驗上與CVS類似,同時Subversion努力彌補CVS許多明顯的缺陷。
Subversion可以在多種不同的操作系統上運行,它的主要用戶操作界面是基于命令行的,但現在已經開發出很多可以運行在不同操作系統上的客戶端以及多種開發工具的集成套件。
下面從幾個方面具體介紹Subversion。
Subversion是什么?Subversion是一個自由/開源版本控制系統,它管理文件和目錄可以超越時間。一組文件存放在中心版本庫,這個版本庫很像一個普通的文件服務器,只是它可以記錄每一次文件和目錄的修改,這便使你可以取得數據以前的版本,從而可以檢查所作的更改。從這個方面看,許多人把版本控制系統當作一種“時間機器”。
Subversion可以通過網絡訪問它的版本庫,從而使用戶可以在不同的電腦上使用。一定程度上可以說,允許用戶在各自的地方修改同一份數據是促進協作。進展可能非常的迅速,并沒有一個所有的改變都會取得效果的通道,由于所有的工作都有歷史版本,你不必擔心由于失去某個通道而影響質量,如果存在不正確的改變,只要取消改變。
一些版本控制系統也是軟件配置管理(SCM)系統,這種系統經過特定的精巧設計來管理源代碼,有許多關于軟件開發的特性—本身理解編程語言、或者提供構建程序的工具。然而,Subversion不是這樣一個系統,它是一個通用系統,可以管理任何類型的文件集,對你這可能是源代碼—對別人,可能是一個貨物清單或者是數字電影。
Subversion的歷史早在2000年,CollabNet, Inc. (http://www.collab.net) 開始尋找CVS替代產品的開發人員,CollabNet提供了一個協作軟件套件SourceCast,它的一個組件是版本控制系統。盡管 SourceCast在初始時使用CVS作為其版本控制系統,但是CVS的局限性在一開始很明顯,CollabNet知道遲早要找到一個更好的替代品。遺憾的是,CVS成為了開源世界事實上的標準,因為沒有更好的產品,至少是沒有可以自由使用的。所以CollabNet決定寫一個新的版本控制系統,建立在CVS思想之上的,但是修正其錯誤和不合理的特性。
2000年2月,他們聯系Open Source Development with CVS(Coriolis, 1999)的作者Karl Fogel,并且詢問他是否希望為這個新項目工作,巧合的是,當時Karl正在與朋友Jim Blandy討論設計一個新的版本控制系統。在1995年,他們兩個曾經開辦一個提供CVS支持的公司Cyclic Software,盡管他們終賣掉了公司,但還是天天使用CVS進行日常工作,在使用CVS時的挫折終促使他們認真地去考慮如何管理標記版本的數據,而且他們當時不僅僅提出了“Subversion”這個名字,并且做出了Subversion版本庫的基礎設計。所以當CollabNet提出邀請的時候,Karl馬上同意為這個項目工作,同時Jim也得到了他的雇主,RedHat軟件贊助他到這個項目并提供了一個寬松的時間。CollabNet雇傭了Karl和Ben Collins Sussman,詳細的設計從三月開始,在Behlendorf 、CollabNet、Jason Robbins 和 Greg Stein(當時是一個獨立開發者,活躍在WebDAV/DeltaV系統規范階段)的恰當激勵的幫助下,Subversion很快吸引了許多活躍的開發者,結果是許多有CVS經驗的人們很樂于有機會為這個項目做些事情。
初的設計小組固定在簡單的目標上,他們不想在版本控制方法學中開墾處女地,他們只是希望修正CVS,他們決定Subversion匹配CVS的特性,保留相同的開發模型,但不復制CVS明顯的缺陷。盡管它不需要成為CVS的繼任者,它也應該與CVS保持足夠的相似性,使得CVS用戶可以輕松的做出轉換。
經過14個月的編碼,2001年8月31日,Subversion自己能夠“成為服務”了,開發者停止使用CVS保存Subversion的代碼,而使用Subversion本身。
當CollabNet開始這個項目的時候,曾經資助了大量的工作(它為全職的Subversion開發者提供薪水),Subversion像許多開源項目一樣,被一些激勵知識界精英的寬松透明的規則支配著。CollabNet的版權許可證完全符合Debian的自由軟件方針,也是說,任何人可以自由的下載,修改和重新發布,不需要經過CollabNet或其他人的允許。
Subversion的特性當討論Subversion為版本控制領域帶來的特性的時候,通過學習它在CVS基礎上所作的改進會是比較有效的方法。如果你不熟悉CVS,你會不太明白所有的特性,如果你根本不熟悉版本控制,你會瞪著眼無所適從,你好首先閱讀一下有關版本控制的其他介紹。
Subversion提供:
版本化的目錄
CVS只記錄單個文件的歷史,但是Subversion實現了一個可以跟蹤目錄樹更改的“虛擬”版本化文件系統,文件和目錄都是有版本的。
真實的版本歷史
因為CVS只記錄單個文件的版本,對于拷貝和改名—這些文件經常發生的操作,會改變一個目錄的內容—在CVS中并不支持。在CVS里你也不可以用一個完全不同的文件覆蓋原來的同名文件而又不繼承原來文件的歷史。通過Subversion,你可以對文件或是目錄進行增加、拷貝和改名操作,也可以新增一個具有干凈歷史的文件。
原子提交
一系列的改動,要么全部提交到版本庫,要么一個也不提交,這樣可以讓用戶構建一個所要提交修改的邏輯塊,防止部分修改提交到版本庫。
版本化的元數據
每一個文件或目錄都有一套屬性—鍵和它們的值,你可以建立并存儲任何鍵/值對,屬性也是隨時間的流逝而納入版本控制的,很像文件的內容。
可選的網絡層
Subversion在版本庫訪問方面有一個抽象概念,利于人們去實現新的網絡機制,Subversion可以作為一個擴展模塊與Apache結合,這給了Subversion在穩定性和交互性方面很大的好處,可以直接使用服務器的特性—認證、授權和傳輸壓縮等等。也有一個輕型的,單獨運行的 Subversion服務,這個服務使用自己的協議可以輕松的用SSH封裝。
一致的數據操作
Subversion表示文件是建立在二進制文件區別算法基礎上的,對于文本(可讀)和二進制(不可讀)文件具備一致的操作方式,兩種類型的文件都壓縮存放在版本庫中,區別信息是在網絡上雙向傳遞的。
有效率的分支和標簽
分支與標簽的代價不與工程的大小成比例,Subversion建立分支與標簽時只是拷貝整個工程,使用了一種類似于硬鏈接的機制,因而這類操作通常只會花費很少并且相對固定的時間。
可修改性
Subversion沒有歷史負擔,它由一系列良好的共享C庫實現,具有定義良好的API,這使得Subversion非常容易維護,可以輕易的用其他語言操作。
Subversion的架構俯視Subersion的設計,可以看出,一端是保存你所有納入版本控制的數據的Subversion版本庫,在另一端是你的Subvesion客戶端程序,管理著所有納入版本控制數據的本地影射(叫做“工作拷貝”),在這兩極之間是各種各樣的版本庫訪問(RA)層,一些使用電腦網絡通過網絡服務器訪問版本庫,一些則繞過網絡服務器直接訪問版本庫。