軟件的開(kāi)發(fā)和維護(hù)過(guò)程,離不開(kāi)版本管理。對(duì)于一份文件,我們經(jīng)常需要按不同的版本進(jìn)行歸檔,或者從資料庫(kù)里找出反映文件修改歷史的不同版本。這樣一方面可以使各個(gè)階段的代碼和文檔變得井然有序,另一方面可以在當(dāng)前版本出現(xiàn)問(wèn)題的時(shí)候,找回先前的版本。當(dāng)然,人們希望的還不止這些,例如,人們希望規(guī)定誰(shuí)在什么時(shí)候可以如何存取某個(gè)版本的內(nèi)容,也希望差異不大的版本按增量的方式存成一個(gè)文件,以節(jié)省存儲(chǔ)空間……毫無(wú)疑問(wèn),我們需要一種對(duì)文件版本進(jìn)行控制管理的工具,以有效地控制產(chǎn)品的質(zhì)量,提高項(xiàng)目開(kāi)發(fā)管理水平。
CVS(Concurrent VersionsSystem)是一個(gè)能讓很多程序開(kāi)發(fā)者同時(shí)進(jìn)行軟件開(kāi)發(fā)的、強(qiáng)大的版本管理控制工具。CVS并不是Internet的產(chǎn)物,而它的出現(xiàn)卻是歷史的必然。Richard Stallman倡導(dǎo)的開(kāi)源軟件運(yùn)動(dòng)大大加速了這一過(guò)程。
起因
開(kāi)源軟件的一個(gè)重要特點(diǎn)是可以從世界任何地方獲得代碼和改進(jìn)代碼,這是傳統(tǒng)軟件開(kāi)發(fā)所不具備的。這意味著開(kāi)源軟件的開(kāi)發(fā)在全球開(kāi)發(fā)者的協(xié)作下成為一個(gè)不間斷的過(guò)程,每個(gè)人都可能成為開(kāi)發(fā)隊(duì)伍的一員,并且每個(gè)人都會(huì)隨時(shí)流動(dòng)。一個(gè)地域上分散的志愿者組織顯然不能投入很多的時(shí)間來(lái)訓(xùn)練其成員彼此合作,這需要一套項(xiàng)目管理辦法,確保新成員能較容易地適應(yīng)工作;同時(shí)有一個(gè)自動(dòng)的機(jī)制接收外來(lái)代碼,使每個(gè)成員能及時(shí)得到新修改的代碼。當(dāng)然,這不僅僅是開(kāi)源社區(qū)的需要,只是開(kāi)源社區(qū)的人員分散、資源不易管理,更需要一個(gè)版本管理工具。這樣的一個(gè)工具首先應(yīng)該支持世界范圍的協(xié)作,保持發(fā)布版本的一致性;其次它能夠容易地匯集各個(gè)特定版本的Bug,并在全球范圍同步一致地進(jìn)行修改;再者它需要使任何一個(gè)開(kāi)發(fā)者能夠追蹤軟件的變化;而在開(kāi)發(fā)者為軟件增加新功能的同時(shí),不能妨礙一般用戶使用一個(gè)相對(duì)穩(wěn)定的版本。
CVS很好地解決了這一問(wèn)題。除了開(kāi)發(fā)人員可以使用CVS很容易地把代碼變化存入代碼庫(kù)之外,它還為不同角色的人員設(shè)置了不同的訪問(wèn)權(quán)限。例如,不需要修改代碼的人員可以以匿名只讀方式訪問(wèn)代碼庫(kù)。而需要修改代碼的開(kāi)發(fā)人員每個(gè)人都能在自己的機(jī)器上建立一個(gè)開(kāi)發(fā)樹(shù),當(dāng)需要在一個(gè)特殊的代碼區(qū)工作時(shí),首先通過(guò)簡(jiǎn)單的命令,使開(kāi)發(fā)樹(shù)獲得更新,以保持全球范圍開(kāi)發(fā)狀態(tài)的同步一致。這樣可以避免出現(xiàn)這樣的問(wèn)題:花了半天時(shí)間修改的Bug,在提交的時(shí)候發(fā)現(xiàn)別人已經(jīng)解決了。一旦確認(rèn)代碼中的Bug別人還沒(méi)解決,開(kāi)發(fā)者可以馬上開(kāi)始工作。當(dāng)這些問(wèn)題解決后,CVS會(huì)自動(dòng)產(chǎn)生補(bǔ)丁,并將補(bǔ)丁發(fā)送給維護(hù)人員進(jìn)行檢查,后可能將其并入主項(xiàng)目樹(shù)中去。
發(fā)展歷程
早在CVS之前,出現(xiàn)過(guò)對(duì)變化前后的文件進(jìn)行比較,并根據(jù)異同形成“補(bǔ)丁”(Patch)的工具。例如,Unix上使用的Diff和LanyWall寫的Patch,這兩個(gè)工具對(duì)程序代碼的傳播和維護(hù)起到了重要作用。但是,后來(lái)出現(xiàn)的許多要求Diff和Pach都顯得無(wú)能為力,例如,發(fā)現(xiàn)修補(bǔ)出錯(cuò)而需要退回到以前未修改的狀態(tài)等。這要求有一個(gè)保存項(xiàng)目歷史紀(jì)錄的系統(tǒng)。
當(dāng)時(shí)初步具備這個(gè)功能的工具是SCCS(Source Code Control System),是貝爾實(shí)驗(yàn)室的MarcRochkind在1972年寫成的。SCCS是一種基本的源文件版本控制工具,適用于正文文件的版本維護(hù)。它基于單一文件的版本控制,代碼庫(kù)和要維護(hù)的文件通常在同一目錄下。SCCS有一個(gè)專門的SCCS文件保留源文件的各編碼版本,其中記錄了足夠的信息來(lái)恢復(fù)一個(gè)版本,并記錄了誰(shuí)對(duì)文件有修改權(quán)、有版本鎖的功能。SCCS是AT&T Unix發(fā)行版的一部分。
然而,自由軟件項(xiàng)目終選擇了Walter F.Tichy的版本控制系統(tǒng)(RCS)來(lái)滿足他們的需要。RCS在SCCS基礎(chǔ)上加以改進(jìn),界面也更加友好,是BSDUnix發(fā)行版的一部分。它可以追蹤文件的改變,在工作組中對(duì)文件的共享和訪問(wèn)進(jìn)行控制,通常用于維護(hù)源代碼;也能追蹤文件的修改歷史。RCS包含一套命令,用于設(shè)置RCS源碼庫(kù)中的文件屬性、檢入檢出文件、清除文件、比較修訂版本,以及合并文件等。由RCS管理的文件可以既可以是純文本文件,也可以是二進(jìn)制文件。
然而,RCS仍存在幾個(gè)重要缺陷,其中主要的是由于使用單一目錄控制與檔案鎖,無(wú)法讓多個(gè)編程人員同時(shí)開(kāi)發(fā)。因?yàn)镽CS本身不是針對(duì)網(wǎng)絡(luò)環(huán)境寫的,開(kāi)發(fā)者只能在RCS代碼庫(kù)所在的機(jī)器上工作,難以在分布式環(huán)境下開(kāi)發(fā)。這些缺點(diǎn)后來(lái)在CVS中都得到了改進(jìn)。1956年DickGrune寫了一段Shell腳本來(lái)簡(jiǎn)化RCS的使用。1986年10月,它的第6個(gè)發(fā)行版被放到USENET新聞組comp.soures.unix之中。1989年3月,Brian Berlinor用C語(yǔ)言重新設(shè)計(jì)并編寫了CVS的代碼。后來(lái),JettPolk幫助Brian完成了CVS模型設(shè)計(jì),增加了一些關(guān)鍵特性。1993年前后,JimKingdon終將CVS設(shè)計(jì)成基于網(wǎng)絡(luò)的平臺(tái),開(kāi)發(fā)者們能從Internet任何地方獲得程序源代碼。
特點(diǎn)
CVS本身是開(kāi)源項(xiàng)目,通過(guò)其方便的功能使眾多的人們加入到開(kāi)源軟件項(xiàng)目之中,促進(jìn)了開(kāi)源運(yùn)動(dòng)的發(fā)展。反過(guò)來(lái),開(kāi)源項(xiàng)目的成功又促使版本管理工具不斷完善,F(xiàn)在大多數(shù)開(kāi)源軟件項(xiàng)目都使用CVS做為版本控制和協(xié)作開(kāi)發(fā)的工具,其中不乏像GNOME、KDE、Apache這樣的龐大的項(xiàng)目,充分顯示了CVS做為版本控制工具的成功。
歸結(jié)起來(lái),CVS為開(kāi)源項(xiàng)目做出的貢獻(xiàn)大致有兩點(diǎn):一是由于它通過(guò)眾人的參與使開(kāi)源軟件質(zhì)量不斷提高;二是它方便了全球軟件工作者的協(xié)作,使軟件成為全人類智慧的結(jié)晶。這大概是CVS在自由軟件世界中處于主導(dǎo)地位的原因了。
盡管CVS的功能和使用方法看起來(lái)頗為龐大復(fù)雜,其實(shí)CVS重要的只有兩點(diǎn),即記錄保存和協(xié)作。人們有時(shí)要將一個(gè)程序的當(dāng)前狀態(tài)與先前某一狀態(tài)做比較。例如,在為程序添加新功能的過(guò)程中,有人可能會(huì)通報(bào)試用版的Bug。為了找到問(wèn)題之所在,一方面程序必須可以找回原來(lái)某時(shí)的可用狀態(tài)。事實(shí)上,開(kāi)發(fā)者可以簡(jiǎn)單地說(shuō)一句,把以前程序的狀態(tài)給我,或者說(shuō)把新公開(kāi)發(fā)行的版本給我,這是CVS對(duì)歷史記錄的保存作用。另一方面,CVS系統(tǒng)要順利工作,開(kāi)發(fā)者必須彼此知道在某個(gè)時(shí)刻準(zhǔn)備做什么工作。CVS能夠在代碼提交的時(shí)候提醒開(kāi)發(fā)者代碼是否存在沖突;當(dāng)某人因?yàn)闄?quán)限問(wèn)題不能工作的時(shí)候,彼此能很快地溝通。這是CVS協(xié)同工作、跟蹤沖突的能力。CVS的一般任務(wù)主要是訪問(wèn)已有的代碼庫(kù)、創(chuàng)建新項(xiàng)目、檢出工作拷貝、進(jìn)行更改、檢測(cè)并解決沖突、瀏覽記錄信息、檢查并還原更改等。
CVS現(xiàn)已成為廣泛使用的版本管理系統(tǒng),普遍應(yīng)用在軟件開(kāi)發(fā)過(guò)程中,是基本的軟件工程配置管理工具之一。不論是一個(gè)龐大的工程,如GNOME、Apache,還是個(gè)人開(kāi)發(fā)一個(gè)小軟件,都可以方便地使用CVS來(lái)管理開(kāi)發(fā)過(guò)程,提高效率,方便管理。
創(chuàng)始者
CVS的開(kāi)發(fā)隊(duì)伍共有18個(gè)人,其管理者都是對(duì)CVS的發(fā)展有過(guò)突出貢獻(xiàn)的。CVS由開(kāi)發(fā)者們共同決定如何發(fā)展,要做什么關(guān)鍵的改進(jìn)。但是這個(gè)過(guò)程并不完全民主。僅在吸收新的開(kāi)發(fā)成員時(shí),須有多數(shù)人同意才行。其它方面大多不必如此,更不用投票。
CVS主要開(kāi)發(fā)者JimKingdon認(rèn)為,在自由軟件項(xiàng)目中過(guò)分民主會(huì)陷入無(wú)休止投票的泥潭,導(dǎo)致效率低下。而指定單一人員來(lái)維護(hù),對(duì)于自由軟件的開(kāi)發(fā)來(lái)說(shuō)是通行、成功的做法,當(dāng)然也是倍受爭(zhēng)議的。對(duì)于軟件的每一處修改,需要這個(gè)維護(hù)人員的同意,也只能通過(guò)這個(gè)單一的維護(hù)人員授權(quán)給其它下層維護(hù)人員。誠(chéng)然,開(kāi)源軟件的成功要依靠眾人的參與,但是,愿意為軟件效力的每個(gè)人并不都具備編碼的水準(zhǔn),都了解局部改變和整體的關(guān)系,因此不能誰(shuí)說(shuō)了都算,而是要把目光集中在真正有可能給軟件帶來(lái)貢獻(xiàn)的那些人身上。
CVS走過(guò)了一段坎坷的路程。Jim Kongdon既是一個(gè)了不起的程序員,又具有商人的特質(zhì)。JimKingdon畢業(yè)于美國(guó)俄亥俄州的Oberlin學(xué)院,之后曾為自由軟件基金會(huì)(FSF)工作過(guò)。1993年之后,除了開(kāi)發(fā)CVS之外,他還是Cygnus的工程師,為GDB修補(bǔ)Bug。他自己開(kāi)過(guò)一個(gè)Cyclic公司。Cyclic是靠提供CVS支持服務(wù)來(lái)賺錢的公司。JimKingdon 1995年白手起家,到了1998年經(jīng)營(yíng)收入已達(dá)到了13.5萬(wàn)美元。離開(kāi)Cyclic之后,Jim Kingdon在RedHat工作了一年,后來(lái)頻繁“跳槽”。2002年之后,他在加利福尼亞Fremont的Enlighta公司當(dāng)程序員,為Web/SQL做測(cè)試。他的自我發(fā)展目標(biāo)是甘愿當(dāng)一個(gè)程序員,與同事、客戶、合作伙伴一道創(chuàng)造和維護(hù)高質(zhì)量的軟件。他本人興趣甚廣,除了編程,他還熱衷太空市場(chǎng),學(xué)習(xí)西班牙語(yǔ)、日語(yǔ)和世界語(yǔ)等。
長(zhǎng)期以來(lái),Cyclic維護(hù)著CVS的“官方”網(wǎng)站http://www.cvshome.org/。但是,除少數(shù)人員的重合外,Cyclic和CVS的開(kāi)發(fā)隊(duì)伍基本上是獨(dú)立的。1999年,Jim Kingdon突然宣布他要離開(kāi)Cyclic去RedHat工作,他將Cyclic賣給了Source Gear公司,同時(shí)Cyclic也發(fā)布了一個(gè)聲明,說(shuō)它不再正式支持CVS。這帶來(lái)一場(chǎng)不小的震動(dòng)。
SourceGear也是一家銷售和維護(hù)軟件的公司,它希望能夠作為CVS的供應(yīng)商,使CVS變得有利可圖,終成為CVS發(fā)展的領(lǐng)頭羊。盡管實(shí)際情況不盡人愿,一些CVS的開(kāi)發(fā)者并不買他們的賬,但Source Gear還是為CVS做了一些實(shí)質(zhì)性的工作。而CVS的開(kāi)發(fā)者迅速成立了一個(gè)新的項(xiàng)目CVSContinuity Project,其目的是使CVS開(kāi)發(fā)、維護(hù)工作能夠繼續(xù)正常進(jìn)展下去,F(xiàn)在CVS的網(wǎng)站掛在YankeeGroup麾下CollabNet公司的SourceCase網(wǎng)站上,SourceCase是專門為全球志愿的開(kāi)發(fā)人員協(xié)同開(kāi)發(fā)軟件提供的Web空間。
除了Jim Kingdon以外,CVS開(kāi)發(fā)隊(duì)伍中的一些關(guān)鍵人物是:
◆Steve Willer為CVS社團(tuán)做了大量的服務(wù)工作,在郵件組中回答各種問(wèn)題,并向開(kāi)發(fā)團(tuán)隊(duì)報(bào)告具有共性的Bug。
◆Pascal Molli負(fù)責(zé)網(wǎng)站http://www.loria.fr/~molli/cvs-index.html的維護(hù)。這個(gè)網(wǎng)站上面放著新版本的CVS和各種CVS文檔,以及與相關(guān)資源的鏈接等。
◆David Klann維護(hù)著info-cvs MINI-FAQ(常見(jiàn)問(wèn)題解答),并定期更新。這個(gè)FAQ鏈接著各個(gè)相關(guān)的地址,提供各種公眾需要的信息。
◆David W. Eaton維護(hù)著comp.software.config-mgmt FAQ。這是一項(xiàng)艱巨的工作,因?yàn)樗噲D把整個(gè)配置管理領(lǐng)域都囊括進(jìn)去,而不僅僅是CVS。
版本與相關(guān)項(xiàng)目
目前,新的CVS版本是2004年3月13日發(fā)布的1.12.6,穩(wěn)定版本是2004年3月11日發(fā)布的1.11.14。CVS支持的平臺(tái)包括Windows 32、Linux和Unix等。
CVS有多個(gè)發(fā)展方向,相關(guān)的開(kāi)發(fā)項(xiàng)目主要有:
◆Anonymous CVS Access Via ssh 加強(qiáng)CVS的安全。
◆Bonsai 為CVS增加基于web的圖形界面。
◆CHalogen The Change Log Generator,產(chǎn)生HTML形式的變化日志。
◆Component Software CVS for Windows Windows平臺(tái)下的CVS前端。
◆CVS Access Control List Extension 為CVS遠(yuǎn)程代碼庫(kù)增加ACL訪問(wèn)控制。
◆CVS Code Historian 在MS VisualStudio或?yàn)g覽器中,利用CVS記載的信息進(jìn)行文件比較或分析。
◆CVS for MVS 把CVS移植到MVS/OS390/USS主機(jī)。
◆CVS Monitor CVS代碼庫(kù)瀏覽器。
◆CVS version control for web development 為Web開(kāi)發(fā)者寫的CVS工具。
◆CVS via FTP 通過(guò)FTP實(shí)現(xiàn)CVS網(wǎng)站鏡像。
◆cvs2cl CVS日志轉(zhuǎn)換。
◆cvsdude 在Windows和類Unix客戶端平臺(tái)上用命令行訪問(wèn)CVS。
◆CVSGrab 通過(guò)防火墻獲得CVS樹(shù)。
◆cvs2html 將CVS日志轉(zhuǎn)成HTML格式。
◆cvsknit A CVS automation suite,粘合多個(gè)CVS代碼庫(kù)的自動(dòng)工具。
◆cvslock 維護(hù)和檢視多個(gè)代碼庫(kù),保持同步。
◆CVSNT 在Windows NT/2000下運(yùn)行的CVS服務(wù)器。
◆Cvsplot 為CVS控制的文件提供統(tǒng)計(jì)信息。
◆CVSSearch 通過(guò)CVS命令來(lái)檢索代碼片斷的工具。
◆CVSspam Notification of CVS committs, by email。當(dāng)CVS有變化提交時(shí)發(fā)出E-mail。
◆CVSSupport 用Perl寫的CVS工具。
◆CVSToys CVS變化提交時(shí)的通知工具。
◆CVSTrac 基于Web的Bug和補(bǔ)丁跟蹤系統(tǒng)。
◆CVSup 通過(guò)網(wǎng)絡(luò)發(fā)布和更新批量文件的軟件包。
◆CVSweb for Windows 95/NT/2000 為在Windows PWS/IIS上運(yùn)行CVS Web提供的指令。
◆CVSweb (Henner Zeller version) 用Perl腳本通過(guò)RCS命令為CVS加上Web接口。
◆StatCvs 產(chǎn)生HTML和PNG格式的CVS代碼庫(kù)的統(tǒng)計(jì)信息。
◆ViewCVS 用Python寫的類似CVS Web工具。
◆ViewCVS for Windows ViewCVS到Windows平臺(tái)的移植,運(yùn)行于IIS。
CVS是一個(gè)廣泛使用的版本控制系統(tǒng),隨著互聯(lián)網(wǎng)的普及,分布在世界各地的程序員會(huì)越來(lái)越多地采用它進(jìn)行版本控制和開(kāi)發(fā)。