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