零基礎(chǔ)學(xué)習(xí)SVN之(二):CVS與SVN的區(qū)別
相信大家看了零基礎(chǔ)學(xué)習(xí)SVN之(一):SCM與SVN的使用(基礎(chǔ)篇)這篇博客之后,對(duì)版本控制就有了一定的理解,同時(shí)也應(yīng)該知道SVN與CVS是比較流行的兩款SCM工具。那么到底這兩款工具有什么區(qū)別呢?
1、版本編號(hào)方面
例如,我們的版本庫(kù)為A,其中有文件a,b,c。
在SVN中,新版本的版本號(hào)不是針對(duì)某個(gè)特定文件的,而是針對(duì)整個(gè)庫(kù)而言的。提交了5次和提交了6次,文件a有可能不同,也有可能相同,即1.0版和1.1版可能相同。因?yàn)榈?次提交有可能是因?yàn)槲募或c進(jìn)行了修改。而在CVS中則相反,每次更新可能只對(duì)文件的版本號(hào)進(jìn)行修改,即a文件的1.0版和1.1版是肯定不同。
(在這里糾正一個(gè)概念,“文件a的第2版本”這個(gè)說法是錯(cuò)誤的,應(yīng)該是“文件a的第2次修改,即第二次Commit”)
SVN的全局性版本編號(hào)為SVN帶來(lái)了諸多的優(yōu)勢(shì):如對(duì)目錄或文件執(zhí)行拷貝,無(wú)論涉及多少文件,SVN不需要對(duì)單個(gè)文件依次執(zhí)行拷貝命令,僅僅需要建立一個(gè)指向相應(yīng)的全局版本號(hào)的一個(gè)指針即可。
2、目錄的版本控制
CVS只能對(duì)文件進(jìn)行版本控制,不能對(duì)目錄進(jìn)行版本控制,這就導(dǎo)致CVS失去了很多功能:
1)沒有移動(dòng)操作
CVS里沒有移動(dòng)(move)這個(gè)操作,當(dāng)人為進(jìn)行文件移動(dòng)操作時(shí),CVS只能注意到,一個(gè)文件在一個(gè)位置被刪除了,而在一 個(gè)新位置創(chuàng)建了另外一個(gè)文件。由于它不會(huì)連接兩個(gè)操作,因此也很容易使文件歷史軌跡丟失。所以使用CVS時(shí),每個(gè)文件的位置一定要謹(jǐn)慎的選擇。
2)沒有重命名操作
CVS里沒有重命名(rename)這個(gè)操作,人為的對(duì)文件進(jìn)行重命名會(huì)使得命名前后的文件失去歷史聯(lián)系,而記錄歷史本來(lái)是版本管理的主要目的。
3)沒有拷貝操作
CVS中沒有拷貝(copy)這個(gè)操作,人為的拷貝對(duì)CVS而言,只能看到新的文件的增加,而不能記錄拷貝源文件和目標(biāo)文件之間的聯(lián)系。
而SVN從很大程度上避免了這些不足,SVN將目錄作為一類特殊的文件來(lái)處理。當(dāng)目錄中的子目錄/文件被刪除、重命名、或新的子目錄/文件被創(chuàng)建時(shí),目錄的內(nèi)容將發(fā)生改變。因此,SVN象記錄普通文件的修改歷史一樣記錄對(duì)目錄的修改歷史,當(dāng)發(fā)生文件/目錄的移動(dòng)、重命名或拷貝操作時(shí),SVN能夠準(zhǔn)確記錄操作前后的歷史聯(lián)系。同樣,像對(duì)文件的不同歷史版本進(jìn)行比較一樣,SVN支持對(duì)目錄的不同歷史版本的比較,清晰展現(xiàn)目錄的變化歷史。
3、原子性提交
CVS和SVN同樣作為SCM版本控制管理工具,SVN的原子性提交可謂是技高一籌啊!
SVN提交文件,只有當(dāng)全部文件修改都成功入庫(kù),該提交才變得有效。一旦中斷,SVN將會(huì)自動(dòng)執(zhí)行“回滾”(rollback)操作。SVN 這種機(jī)制保證所有的修改要么全部入庫(kù)生效,要么一個(gè)也不入庫(kù)。由于SVN的原子性提交特性和全局版本編號(hào)方式,當(dāng)提交成功完成時(shí),一個(gè)唯一的、新的全局版本編號(hào)產(chǎn)生,而提交時(shí)用戶提供的日志信息與該新的版本編號(hào)關(guān)聯(lián),只進(jìn)行一次存儲(chǔ)(區(qū)別于CVS的按文件重復(fù)存儲(chǔ))。
而CVS則采用線性、串行的批量提交,即依次地,一個(gè)接一個(gè)地執(zhí)行提交,每成功提交一個(gè)文件,該文件的一個(gè)新的版本即被記錄到版本庫(kù)中。但當(dāng)任何原因造成批量操作的中斷時(shí),版本庫(kù)往往處于一個(gè)不一致的狀態(tài)。另外,CVS即使在批量提交不發(fā)生中斷時(shí)也會(huì)造成不一致:假設(shè)用戶A啟動(dòng)一個(gè)需要較長(zhǎng)時(shí)間才能完成的批量提交;與此同時(shí),用戶B執(zhí)行cvsupdate操作。此時(shí),用戶B很有可能得到一個(gè)不一致的更新,即用戶B通過“更新”操作,得到用戶A的部分修改文件。
4、變更集概念的支持
由于SVN提交是原子性的,每次成功提交形成的唯一的全局版本號(hào)對(duì)應(yīng)此次批量提交的所有文件修改,也就是說,一個(gè)SVN版本號(hào)其實(shí)對(duì)應(yīng)了一個(gè)邏輯上的變更集,該變更集可能對(duì)應(yīng)于對(duì)一個(gè)BUG的修復(fù),或者對(duì)應(yīng)于對(duì)一個(gè)已有功能的改進(jìn),或者對(duì)應(yīng)于一個(gè)新功能的實(shí)現(xiàn)。可以說,變更集是一個(gè)軟件開發(fā)活動(dòng)的邏輯結(jié)果,該變更集可以通過其對(duì)應(yīng)的版本號(hào)在軟件開發(fā)的其他過程中(如軟件合并/集成過程,軟件發(fā)布管理,變更管理系統(tǒng),缺陷追蹤系統(tǒng))被引用。因此,SVN將版本管理從單純的、單個(gè)的文件修改的層次通過邏輯上的抽象,上升到更便于理解和交流的開發(fā)活動(dòng)的層次。
5、差異化的二進(jìn)制文件處理
CVS最初設(shè)計(jì)是為處理文本文件(或ASCII文件,源代碼文件),對(duì)文本文件進(jìn)行差異化的存儲(chǔ)、新舊版本的比較,文件合并等。但對(duì)于二進(jìn)制文件,CVS則明顯力不從心。在CVS的版本庫(kù)中,對(duì)于二進(jìn)制文件的歷史版本,CVS是對(duì)不同的版本進(jìn)行獨(dú)立的、冗余的存儲(chǔ),哪怕版本之間其實(shí)只存在微小的差異。與CVS不同,SVN每次提交后版本庫(kù)中只存儲(chǔ)相對(duì)于先前版本的差異,從而可以節(jié)省大量的存儲(chǔ)空間。更為重要的是,當(dāng)客戶端需要獲取新的版本時(shí),SVN只傳輸版本的差異,從而大大減少對(duì)網(wǎng)絡(luò)帶寬的消耗。
說了這么多,好像全是在說SVN得優(yōu)點(diǎn),其實(shí)它也不是那么完美。下面來(lái)分析一下SVN的一些不足之處。
1)對(duì)中文路徑名的支持
cvs:支持的比較好
svn:要將權(quán)限控制文件保存為svn支持的UTF-8格式
2)本地文件與庫(kù)的對(duì)應(yīng)關(guān)系
cvs:可以多對(duì)多
svn:一個(gè)庫(kù)可以有多個(gè)工作目錄,但一個(gè)工作目錄只能對(duì)應(yīng)一個(gè)庫(kù),雖然可以更改庫(kù)位置但是要求很嚴(yán)格。
3)庫(kù)中文件存放方式
cvs:完全用戶可見方式與客戶端文件夾結(jié)構(gòu)完全一直(cvs生成文件除外)
svn:看不到文件真正的內(nèi)容
相關(guān)鏈接:
posted on 2012-08-20 10:32 順其自然EVO 閱讀(1162) 評(píng)論(0) 編輯 收藏 所屬分類: CMMI & QA