您的位置:軟件測試 > 開源軟件測試 > 開源配置管理工具 > SVN
Subversion與CVS的對比
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時間:[ 2013/4/2 15:03:30 ] 推薦標(biāo)簽:

Subversion 徹底消除了CVS 的以上弊端。無論批量提交包含多少文件修改,只有當(dāng)全部文件修改都成功入庫,該提交才變得有效,才對其他用戶可見;否則,無論任何原因造成中斷,Subversion 都會自動執(zhí)行“回滾”(rollback)操作。換一個說法,Subversion 保證所有的修改要么全部入庫生效,要么一個也不入庫,即對版本庫不作任何的修改。這是Subversion 的原子性提交(atomic commit)。

由于Subversion 的原子性提交特性和全局版本編號方式,當(dāng)提交成功完成時,一個的、新的全局版本編號產(chǎn)生,而提交時用戶提供的日志信息與該新的版本編號關(guān)聯(lián),只進(jìn)行一次存儲(區(qū)別于CVS 的按文件重復(fù)存儲)。

五、支持變更集概念

由于Subversion 的所有提交是原子性的,每次成功提交形成的的全局版本號對應(yīng)此次批量提交的所有文件修改,也是說,一個Subversion 版本號其實對應(yīng)了一個邏輯上的變更集(change set),該變更集可能對應(yīng)于對一個BUG 的修復(fù),或者對應(yīng)于對一個已有功能的改進(jìn),或者對應(yīng)于一個新功能的實現(xiàn)?梢哉f,變更集是一個軟件開發(fā)活動的邏輯結(jié)果,該變更集可以通過其對應(yīng)的版本號在軟件開發(fā)的其他過程中(如軟件合并/集成過程,軟件發(fā)布管理,變更管理系統(tǒng),缺陷追蹤系統(tǒng))被引用。因此,Subversion 將版本管理從單純的、單個的文件修改的層次通過邏輯上的抽象,上升到更便于理解和交流的開發(fā)活動的層次。

六、差異化的二進(jìn)制文件處理

由于歷史原因,CVS 主要是為早期的程序員設(shè)計的,CVS 能夠有效處理文本文件(或ASCII文件,源代碼文件),可以對文本文件進(jìn)行差異化的存儲、新舊版本的比較,文件合并等;但對于二進(jìn)制文件,CVS 則明顯力不從心。在CVS 的版本庫中,對于二進(jìn)制文件的歷史版本,CVS 能做的是對不同的版本進(jìn)行獨立的、冗余的存儲,哪怕版本之間其實只存在微小的差異。舉例而言,一個10M 的二進(jìn)制文件(照片、圖形文件、機械設(shè)計文件、電子設(shè)計文件)假如每周修改一次,無論每次修改的大小,一年下來,僅該文件要消耗500M 以上的存儲空間。而且,客戶端每次獲取該文件的新版本都要消耗10M 的網(wǎng)絡(luò)流量。

對于目前的開發(fā)團隊,無論是軟件開發(fā),Web 站點的開發(fā),手機等電子產(chǎn)品的研發(fā),需要進(jìn)行版本管理的不僅是源代碼等文本文件,還需要管理需求文檔、設(shè)計文檔、測試文檔、用戶手冊,圖形圖像文件,機械/電子設(shè)計文件等諸多的二進(jìn)制文件,CVS 顯然不是一個好的選擇。

與CVS 不同,Subversion 采用統(tǒng)一的二進(jìn)制差異算法(binary differencing algorithm),即對文本文件和二進(jìn)制文件采用相同的差異比較算法,并以相同的方式在版本庫中進(jìn)行存儲:每次提交后版本庫中只存儲相對于先前版本的差異,從而可以節(jié)省大量的存儲空間。

該二進(jìn)制差異算法不僅應(yīng)用在版本的存儲上,更為重要的是,Subversion 對二進(jìn)制文件與文本文件一視同仁,當(dāng)客戶端需要獲取新的版本時(如執(zhí)行svn update),在網(wǎng)絡(luò)上只有版本的差異被傳輸,從而大大減少對網(wǎng)絡(luò)帶寬的消耗。更多細(xì)節(jié)參見“七、雙向的差異化-壓縮網(wǎng)絡(luò)傳輸”。

七、 雙向的差異化-壓縮網(wǎng)絡(luò)傳輸

如上所述,CVS 對二進(jìn)制文件不能進(jìn)行有效的差異化處理。對于文本文件,CVS 僅僅支持單向的差異化傳輸:從CVS 服務(wù)器到客戶端的傳輸是差異化的,即執(zhí)行cvs update 時,只有差異的部分從服務(wù)器傳輸?shù)娇蛻舳;而?dāng)執(zhí)行cvs commit 時,無論代碼變化多少,CVS 都需要從客戶端向服務(wù)器完整傳輸被修改文件的全部內(nèi)容,不能只傳輸差異。

相反,無論是文本文件還是二進(jìn)制文件,Subversion 都進(jìn)行雙向的差異化傳輸,并且差異化內(nèi)容還要進(jìn)行壓縮/解壓縮的過程:在服務(wù)器端獲取差異顯而易見,與CVS 類似;Subversion 在客戶端獲取差異的秘密在于 — Subversion 在客戶端的工作拷貝中隱含了每個文件的一個“只讀的、干凈的”副本(該副本隱藏在隱含目錄.svn 里,通常不可見,該副本還有更多的妙用,參見“十二、更多的本地/離線操作”),通過比較用戶在客戶端的修改和該隱含的副本,Subversion 獲取需要真正傳送到服務(wù)器的差異,并對差異進(jìn)行壓縮后才進(jìn)行網(wǎng)絡(luò)傳輸。

對CVS 而言,操作的成本(網(wǎng)絡(luò)帶寬消耗是大的操作成本)與被修改的文件的大小成比例,而與修改本身的大小無關(guān);對Subversion 而言,操作成本只與修改本身的大小成比例,而與被修改的文件的大小無關(guān)。因此,與CVS 相比,Subversion 消耗更少的網(wǎng)絡(luò)帶寬(以客戶端的存儲空間換取更少的帶寬消耗在目前的計算環(huán)境下應(yīng)該是個相當(dāng)不錯的選擇。ubversion 更加適合基于互聯(lián)網(wǎng)(或廣域網(wǎng))進(jìn)行協(xié)作開發(fā)的地理上分布的團隊 — 版本服務(wù)器集中、單一;客戶端廣泛分布。

八、高效、快捷創(chuàng)建分支和基線

CVS 和Subversion 都支持分支(branch)和基線(tag),通過分支與合并,可以有效支持大項目的并行開發(fā)模式;通過基線管理,可以準(zhǔn)確標(biāo)識一組文件的版本,有效進(jìn)行軟件發(fā)布管理和必要時的歷史回溯。

但CVS 和Subversion 在實現(xiàn)分支和基線的方式上存在很大的不同。CVS 在創(chuàng)建分支的時候,需要對所有進(jìn)行分支的文件進(jìn)行依次的操作,因此分支的建立成本(主要是建立分支所需的時間,或消耗的計算資源)與參與分支的文件數(shù)量成比例,項目越大,版本庫越大,文件越多,分支的建立成本越高;基線(tag)的建立與此類似。

Subversion 的分支和基線是通過執(zhí)行“拷貝”來建立的:回想一下在沒有引入版本管理工具的時候我們是如何進(jìn)行所謂的“分支”和“基線”管理的?答案顯然是“拷貝” — 我們通過“拷貝”或“備份”來建立基線;同樣,為支持多個開發(fā)人員可以同時進(jìn)行開發(fā),我們?yōu)槊總開發(fā)人員創(chuàng)建一份“拷貝”。由此看來,Subversion 通過“拷貝”來建立分支和基線顯得非常自然,有點“返樸歸真”的意思。

由于Subversion 的全局版本號特性,Subversion 中分支或基線的創(chuàng)建過程,或Subversion中的“拷貝”過程,真正的操作是在版本庫中創(chuàng)建一個到某一全局版本號的指針(pointer),不再需要針對眾多的單個文件依次執(zhí)行操作。因此,該操作的成本為一個很小的常數(shù),與項目大小,版本庫大小,文件數(shù)目的多少無關(guān);并且,分支或基線的建立不需要進(jìn)行版本的冗余存儲,新建立的分支或基線基本不占用版本庫空間,分支的后續(xù)存儲空間的開銷也只與修改的大小有關(guān)。

九、集成Apache Web Server,提供更多的特性

Subversion 通過與Apache Web Server 的集成,可以提供基于http/https 協(xié)議的版本庫訪問機制,從而支持Subversion 跨越防火墻的安全訪問。除此以外,Subversion 還可以利用更多的Apache 特性,包括但不限于:Apache 豐富的用戶認(rèn)證機制(包括通過LDAP服務(wù)器如Windows Active Directory 服務(wù)器的用戶認(rèn)證),基于目錄路徑的精細(xì)粒度的訪問控制,對傳輸?shù)木W(wǎng)絡(luò)流量進(jìn)行壓縮/解壓縮,瀏覽版本庫目錄結(jié)構(gòu)等等。

上一頁12下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd