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