CVS縱然是一個(gè)老牌的工具產(chǎn)品,并也對(duì)開源事業(yè)有貢獻(xiàn),但CVS的命令行操作著實(shí)讓一些使用者頭疼。在對(duì)一個(gè)特定版本的文檔Check in的時(shí)候,還要輸入一長(zhǎng)串的路徑名、文件名。在操作易用性上與CVS形成對(duì)比的是微軟家族的VSS。作為微軟的產(chǎn)品,在圖形界面化操作上自不用多言,但VSS只能適用于小團(tuán)隊(duì)的開發(fā)工作。VSS是很好的入門級(jí)工具,但它的一些功能也太過(guò)于“入門”,在驗(yàn)證密碼、保存密碼這些基本功能上處理的不盡人意。適用于大型軟件開發(fā)的有“中堅(jiān)級(jí)”的Clearcase,用它來(lái)管理一些小型的項(xiàng)目管理有些“大材小用”。Clearcase支持目錄版本管理、異地團(tuán)隊(duì)開發(fā)、視圖、多服務(wù)器等強(qiáng)大功能,所以一些大公司把它做為一、二級(jí)產(chǎn)品管理用,但同樣它的價(jià)格也不菲。CVS是開源的,免費(fèi)的,更何況它還有一個(gè)理想的替代者——SVN。SVN的設(shè)計(jì)專門針對(duì)CVS的問(wèn)題作了改進(jìn),命令的設(shè)計(jì)更為合理,對(duì)二進(jìn)制文檔和目錄這樣的數(shù)據(jù)加強(qiáng)了控制能力,并且吸收了VSS的lock-modify-update(release)的模式和modify-merge模式的優(yōu)點(diǎn)這兩種方式在一定程度都支持并作了優(yōu)化,沒(méi)有提高使用的復(fù)雜度——這是難能可貴的。由于SVN的設(shè)計(jì)結(jié)構(gòu)很好,所以很容易為它開發(fā)客戶端,好像很快就有了tortoiseSVN,Eclipse插件等很多客戶端,還有WEB模式的,可以遠(yuǎn)程管理,支持RSS更改訂閱。
孰優(yōu)孰劣?
現(xiàn)在又回到“開源軟件 VS.商業(yè)軟件”的老話題上了。先來(lái)看下CVS的基本工作模式:

CVS在服務(wù)器端維護(hù)代碼文檔庫(kù),不同的開發(fā)者在本地機(jī)器上建立對(duì)應(yīng)代碼樹,并利用CVS保持本地代碼文檔同代碼文檔庫(kù)的一致。當(dāng)由于多個(gè)開發(fā)者對(duì)文件的同時(shí)修改造成本地與庫(kù)中的代碼文件沖突時(shí),CVS報(bào)告并協(xié)助解決沖突代碼的合并問(wèn)題。普通開發(fā)者(非管理員)對(duì)CVS的使用流程如下所示:

Check out命令只需在開始建立本地代碼樹時(shí)使用一次,其后更新本地代碼則使用update命令。update命令比較服務(wù)器和本地代碼庫(kù)的區(qū)別,并把本地代碼樹中過(guò)時(shí)的文件自動(dòng)更新。當(dāng)完成對(duì)代碼的修改之后,在提交代碼之前同樣需要使用update命令,以獲取他人并行修改的的代碼。如果出現(xiàn)沖突(即對(duì)同一文件同時(shí)進(jìn)行了修改),CVS將在本地代碼中把兩者都保留并標(biāo)記出來(lái),要求開發(fā)者處理沖突。在沖突不存在或已解決的情況下,使用commit命令將服務(wù)器代碼更新為本地代碼。CVS要求為更改提供注釋,并自動(dòng)為更新的文件處理版本編號(hào)。當(dāng)軟件需要正式發(fā)布時(shí),使用export命令導(dǎo)出不包含CVS設(shè)置信息的源代碼樹。
即使不用拿CVS的升級(jí)版SVN,就算是拿沒(méi)有目錄版本控制功能的 CVS 來(lái)和商業(yè)的版本控制工具相比,我們也有充足的選擇開源版本控制工具的理由:
服務(wù)器端是否和客戶端一樣看起來(lái)很美?
有一些商業(yè)軟件的服務(wù)器端簡(jiǎn)直就像是一個(gè)垃圾場(chǎng),用流水號(hào)命名的文件名,一個(gè)目錄下動(dòng)輒成千上萬(wàn)個(gè)文件。CVS以文件為核心,即面向文件的管理方式,項(xiàng)目文件可以方便地組合和移植。
服務(wù)器端是否在使用數(shù)據(jù)庫(kù)來(lái)作版本控制的數(shù)據(jù)引擎?
為了支持目錄的版本控制工具,大多數(shù)商業(yè)軟件選擇了一個(gè)最為簡(jiǎn)單和直接的解決方案——數(shù)據(jù)庫(kù),用數(shù)據(jù)庫(kù)將文件名和版本庫(kù)對(duì)應(yīng)。但是引入數(shù)據(jù)庫(kù),服務(wù)器的穩(wěn)定性、可維護(hù)性大大下降,成為管理員的噩夢(mèng)。增量備份計(jì)劃難以實(shí)現(xiàn),不知道什么時(shí)候會(huì)出現(xiàn)數(shù)據(jù)庫(kù)崩潰。
是否支持到其他版本控制系統(tǒng)的遷移?
對(duì)于商業(yè)軟件,這個(gè)答案是否定的。如果允許將版本庫(kù)導(dǎo)出到其他版本控制系統(tǒng),簡(jiǎn)直就是將自己好不容易積累的客戶拱手相讓。
可否定制?是否可以對(duì)提交說(shuō)明(Commit Log)進(jìn)行檢查?可否每一次的提交事件能夠收到郵件通知?
CVS 的 CVSROOT 腳本擴(kuò)展,以及 SVN 的 Hooks 鉤子腳本,可以讓用戶充分發(fā)揮想像的空間。而商業(yè)版本控制工具,有此功能的寥寥。
客戶端是如何狀態(tài)保持的?
熟悉 CVS 和 SVN 的用戶應(yīng)該知道工作目錄下的 CVS 和 .svn 隱含目錄的作用,就是用于記錄版本控制狀態(tài)信息的。而很多商業(yè)軟件并沒(méi)有這個(gè)機(jī)制,而是靠服務(wù)器端來(lái)維護(hù)此記錄:哪臺(tái)主機(jī)、檢出哪個(gè)版本的代碼、存儲(chǔ)到哪個(gè)目錄。這么做的一個(gè)弊病就是工作目錄不能自由在硬盤中移動(dòng),系統(tǒng)重裝導(dǎo)致的狀態(tài)丟失。}
成本因素
一是軟件采購(gòu)成本。商業(yè)軟件版本控制工具動(dòng)輒十幾萬(wàn)美金,而且是和用戶數(shù)目掛鉤的。
二是學(xué)習(xí)成本。商業(yè)軟件版本控制工具的部署范圍非常有限,不能保證新員工一定熟悉該系統(tǒng),但是如果選擇開源的版本控制工具,那么員工的培訓(xùn)費(fèi),可能就可以省下了。
客戶確認(rèn)軟件中沒(méi)有木馬、間諜軟件么?
客戶肯定不會(huì)去購(gòu)買你競(jìng)爭(zhēng)對(duì)手開發(fā)的版本控制工具,那么您為什么還會(huì)相信其他閉源的版本控制工具呢?
小結(jié)
再優(yōu)秀的版本控制工具都是軟件項(xiàng)目開發(fā)中的一部份,況且,一個(gè)項(xiàng)目的完成并不只只涉及版本控制工具,還包括其他的一些工具。一個(gè)軟件項(xiàng)目的開發(fā)成功需要涉及工具的使用,開發(fā)人員資源的管理等因素。但是,選擇一款優(yōu)秀的、適合開發(fā)團(tuán)隊(duì)和項(xiàng)目需求的版本控制工具能夠提高開發(fā)工作效率和代碼的優(yōu)質(zhì)性。對(duì)于版本控制工具的選擇,秉持的一個(gè)原則是:“不選貴的,只選對(duì)的。”