劉祖發 鐘湘瓊 王湘



摘要:版本控制系統是軟件開發企業的基礎軟件,是高質量開發軟件的重要保障。經過多年的發展,已有多種版本控制系統面世,有不少產品至今還擁有大量的用戶。文章從功能、架構、性能、成本等方面對當前常見的幾種版本控制系統進行分析比較,為企業在選擇適合自己的版本控制系統時,提供參考。
關鍵詞:版本控制系統(VCS) ;CVS(Concurrent Version System) ;CC(ClearCase) ;SVN(SubVersion) ;Git;比較
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2023)01-0058-03
1 引言
版本控制系統(VCS) 是用于存儲、追蹤文件和目錄及其修改歷史的專用軟件,可以標識不同階段的文件,進行差異分析,也可將修改撤銷,輕松地回退至過去某個版本狀態[1]。在軟件開發過程中,除了代碼文件、源程序外,還會生成需求文件、設計文件、產品文檔、用戶手冊等工件,這些工件隨著項目的推進不斷更新,形成種類繁多、更改頻繁的工件庫,面對這樣一個復雜的工件庫,如何對其進行有序管理、快捷查找、高效利用,成為制約軟件開發質量的一個關鍵問題[2]。可以說,版本控制系統是軟件開發企業的基礎設施之一,是開展軟件配置管理工作的基礎(故版本控制系統通常也被稱為配置管理工具),是軟件開發者的必備工具。
自20世紀60年代末70年代初提出軟件配置管理概念至今,許多軟件公司、軟件開發者先后開發出了RCS(Revision Control System) 、CVS(Concurrent Version System) 、VSS(Visual SourceSafe) 、CC(ClearCase) 、SVN(SubVersion) 、Mercurial、Git等版本控制系統。這些版本控制系統的系統架構、實現方式、性能、使用等方面各有優劣,有些系統雖然有幾十年的歷史,但仍在很多地方使用。
縱觀版本控制系統的發展歷程,可以把版本控制系統的歷史劃分為三代[3]。第一代版本控制系統被稱為本地版本控制系統,通過加鎖將并發執行轉換成順序執行, 一次只能有一個人處理文件,代表產品有RCS;第二代版本控制系統被稱為集中式版本控制系統(Centralized Version Control Systems,CVCS) ,其對同步修改更加寬容,但有一個明顯的限制,用戶必須在提交之前將當前修訂合并到他們的工作中,代表產品有CVS、VSS、SVN、CC;第三代版本控制系統被稱為分布式版本控制系統(Distributed Version Control Systems,DVCS) ,其允許合并和提交分開,在每個使用者電腦上就有一個完整的數據倉庫,沒有網絡依然可以使用,代表產品有Mercurial、Git。
本文將對常見的幾款版本控制系統,從架構、性能、成本等方面進行分析比較。
2 CVS
CVS誕生于1986年,最初它是作為一組shell腳本出現,一直到2010年前后,它仍然被很多企業使用。CVS開創了第二代版本控制系統的歷史,Linux的創始人Linus甚至把Linux的成功歸于CVS。CVS是開源軟件,可以免費獲取使用。
CVS是采用非常典型的客戶端/服務器架構模式,將文件集中存儲于服務器,各用戶把文件檢出到本地,在本地修改后再提交至服務器。其支持并發版本控制,采用無限制的版本管理檢出的模式,即當A用戶檢出一個文件時,B用戶也可以檢出該文件并修改每次可以修改提交多個文件,相比第一代每次只能由一個用戶修改一個文件的版本控制系統,無疑極大地提高了軟件開發效率。因為是用Java編寫的,能夠跨平臺使用。
CVS的缺點在于,權限設置比較復雜,當軟件規模擴大時,CVS不能有效地將開發者在不同的軟件模塊間隔離,無法滿足大規模軟件開發過程中對開發權限的精細管理。不能對目錄進行版本記錄,無法更改文件名稱或移動文件。同時,它多采用命令行方式,學習曲線較高。因為CVS是開源軟件,沒有生產廠家為其提供技術的支持,使用過程中碰到問題,只能靠自己在網上查找解決。
3 SVN
為解決CVS的問題,CVS創始人之一開發了SVN,用以替代CVS,同樣是開源軟件。其使用了改進的“拷貝-修改-合并”功能,使得開發更加便利。采用角色訪問控制策略,通過設計角色與用戶組將用戶與權限關聯,實現對系統權限的精確設置[4]。SVN有一個中央版本庫(Repositor) ,用于集中存放需要管理的文件,用戶將所需的文件檢出(Check out) 或更新(Update) 到本地,修改之后,再提交(Commit) 至中央版本庫。工作原理示意圖如圖1所示。
相比于CVS,SVN具有如下特性[5]。
1) 對目錄進行版本控制
CVS只能記錄單個文件的修改歷史,而SVN借助一個“虛擬”文件系統,可以記錄整個目錄樹的修改,從而可以對文件和目錄進行重命名或移動。
2) 原子化提交
SVN將用戶對同一批次文件的修改記錄作為一個整體,對于這一批修改,提交時,要么全部上傳到中央版本庫,要么都不上傳。這樣就避免了因網絡問題等原因導致部分修改沒有上傳而使中央版本庫與本地不一致的情況。
3) 可選的網絡層
SVN對中央版本庫的訪問功能進行了抽象,使用HTTP的變種協議進行通信,便利SVN可以擁有服務器的一些特性,例如認證、授權、傳輸壓縮等。支持多種訪問方式,方便人們在SVN基礎上開發其他功能。
4) 數據處理的一致性
SVN使用二進制文件差異算法來記錄文件的變更,對文本文件和二進制文件使用相同的處理方式,而且這兩種類型的文件都壓縮存儲在中央版本庫中,在網絡中只傳輸文件兩個版本間的差異,可以大大減少對網絡帶寬的消耗,提升傳輸效率。
5) 創建分支和標簽的效率高
SVN使用一種類似于硬鏈接的機制來創建分支和標簽,不與工程的大小成比例增長,因此,SVN創建分支和標簽時只需花很少且相對固定的時間,也減少了對存儲空間的占用。
因以上的特性,SVN一出來就受到了大家的歡迎,哪怕在Git大行其道的今天,SVN仍占據不少市場空間。
4 CC
CC的全稱是(ClearCase) ,最初是Rational公司的產品,后被IBM收購。它是公認的功能強大,價格昂貴的版本控制系統。CC支持跨平臺使用,依托于操作系統的用戶管理,可進行精確的權限管理。
主要功能有版本控制、工作空間管理、構建管理、過程控制。CC的版本存儲系統庫被稱為VOB(Version Object Bases) ,用于存儲文件及修改記錄,CC稱存儲于其中的文件和目錄為元素(Element) 。工作空間也被稱為視圖(view) ,CC提供了兩種視圖,即靜態視圖和動態視圖。靜態視頻將元素下載到本地工作目錄,動態視頻通過虛擬文件系統提供對元素的存取操作,不需要將元素拷貝到本地[6]。與CVS/SVN不同的是,CC的服務器支持分布式應用,允許VOB和CC的服務器程序運行在不同的服務器上。如果結合ClearQuest等變更管理工具的使用,可以無縫完成絕大部分配置管理工作。因此,CC非常適合大型軟件開發團隊使用。典型的部署架構如圖2所示。
CC的劣勢在于,使用成本較高,除了軟件本身和許可的費用外,不可避免地需要購買技術支持服務;學習成本很高,通常用戶需要經過幾天的專門培訓后,才能正常使用CC,如果要成為一個合格的CC系統管理員,需要更多的培訓時間。跟SVN相比,在CC中創建分支和標簽需要花費較長的時間,而且隨著軟件規模的增長而增長。
5 Git
Git是一個分布式版本控制系統,可以有效、高速地處理從很小到非常大的項目管理。Git是Linux創始人開發出來的開源軟件,是當前最流行的版本控制系統。
對于SVN、CC等第二代集中式版本控制系統來說,因所有文件均保存在中心服務器,開發者必須連接到服務器才能將自己的修改提交,更重要的是,如果中心服務器發生文件丟失的故障,很難進行修復,此時將面臨巨大的開發風險。而分布式版本控制系統則不存在這些問題。使用分布式版本控制系統的每個開發人員都擁有一個完整的版本庫,不管是統一的服務器還是某個開發者終端出現故障,都可以用其他開發者的本地倉庫快速恢復。
在Git中,沒有中心服務器或中央版本庫的概念,取而代之的是本地倉庫(Local Repository) 和遠程倉庫(Remote Repository) ,本地倉庫即為開發者自己終端上的倉庫,遠程倉庫可以是其他開發者的倉庫,也可以是服務器上的倉庫,開發者即可以將本地修改推送到服務器倉庫,也可以直接推送給其他開發者,相反,既可以將服務器倉庫的文件拉取到本地倉庫,也可以將其他開發者倉庫的文件拉取至本地倉庫。當然,在實際使用時,可以指定一臺服務器為“中心服務器”,開發者把自己的修改都推送至該服務器。操作示意圖如圖3所示。
在SVN或CC中,不存在私有分支。當需要開發一個新特性時,在SVN或CC中,必須在中央版本庫(VOB服務器)中創建分支,此時既可能需要管理流程上的批準,也可能導致開發過程中的結果暴露給其他開發人員。而Git支持私有分支,開發人員可以在本地創建私有分支,由本人單獨享有,在該分支上將新特性開發完并驗證無誤后再合并至主分支,共享給其他開發人員。
Git存儲內容時使用SHA-1哈希算法,確保代碼的完整性。與SVN不同,Git并不保存用戶提交內容的差異,而是存儲某個時間的快照,即為該數據的一個完整可用拷貝,這有助力快速恢復到某個歷史版本。快照可以是其所表示的數據的一個副本,也可以是數據的一個復制品[7]。同時,采用壓縮技術,比SVN占用空間更小。
總體上,Git與第二代版本控制系統代表工具SVN對比如表1所示。
Git雖然功能強大、效率高、免費,但不如SVN容易上手,有一定的學習成本。同時,它本身不支持權限控制,無法控制開發人員對不同軟件模塊的訪問,存在一定的風險。
6 結束語
通過以上分析對比,除第一代版本控制系統,第二代和第三代版本控制系統均有自己的優勢和劣勢,在同一代版本控制系統之間,也有各自的長處和短處。企業在先用版本控制系統時,并非最新的就是合適的,而要綜合考慮自身的組織架構、網絡環境及使用者的水平等,選擇最適合自己的版本控制系統。
參考文獻:
[1] 丁賢林.基于SVN的項目文檔管理系統實現[D].成都:電子科技大學,2012.
[2] 戴楠,閆明星.用SVN實現軟件的版本控制[J].電腦知識與技術,2009,5(16):4289-4290,4293.
[3] Sink E.Version Control By Example[M].Pyrenean Gold Press,2011:1.
[4] 李藝.基于SVN的版本與權限管理系統的設計與開發[D].北京:北京工業大學,2016.
[5]TortoiseSVN中文文檔[EB/OL].[2021-09-20].https://tortoisesvn.net/docs/release/Tort-oiseSVN_zh_CN/index.html.
[6] 姜文,劉立康.基于SVN的軟件配置管理和持續集成[J].電子設計工程,2016,24(2):1-5.
[7] 羅力格,麥卡洛,王迪.Git版本控制管理[M].北京:人民郵電出版社,2015.
[8] 王真.版本控制工具在軟件開發項目管理中的應用——以GIT為例[J].項目管理技術,2020,18(6):131-134.
【通聯編輯:謝媛媛】