每個編寫程序的人也許都有過這樣的體驗:對編寫的程序作了一些修改,幾天以后,我們可能發(fā)現(xiàn)上次的修改導致了其它的矛盾,甚至編譯不能通過,但這時我們卻很難找到自己剛在哪里作了改動。一般說來,我們總是希望自己完整的記錄下一個程序開發(fā)的過程,記錄下這個程序的每一點改進和調(diào)整;蛟S我們可以用備份的方法來解決這個問題,于是我們建立一個backup的目錄,定期或不定期的將自己的源程序打包放進去,直到某整個硬盤都被這些文件撐滿。這當然有些夸張,但這種機制帶給我們的不方便是顯而易見的。更進一步,現(xiàn)在一個軟件產(chǎn)品的開發(fā),一個人單槍匹馬很難完成?赡苁前瑤讉、幾十個乃至上百個程序員協(xié)作開發(fā),這時的源代碼又該如何管理?解決問題的方法是使用CVS。 CVS - Concurrent Versions System(并發(fā)版本管理系統(tǒng))是一個版本控制管理系統(tǒng),它是目前為廣泛使用的一個系統(tǒng)。從gftp到gtk到KDE,你幾乎可以在每一個你熟悉的自由軟件的源碼里看到它的蹤跡(下面我們會知道,它的蹤跡指一個稱為cvs的子目錄)。同樣,你也可以在幾乎每一個Linux的發(fā)行版本里看到CVS系統(tǒng)。可以說,如果失去了CVS,現(xiàn)有的許多多人協(xié)作、自由開發(fā)的軟件都會在一定程度上放慢自己發(fā)展的步伐。 CVS到底有哪些功能,使得它有如此強大的魅力呢?
1.CVS能做什么?
如上所說,CVS首先是一個版本管理系統(tǒng),它可以保留軟件開發(fā)過程中的每一個版本的信息,包括誰、在何時、作了什么樣的修改以及為什么作這樣的修改等。這個功能和以前流行于Linux和Unix的版本管理系統(tǒng)RCS(Revision Control System)和SCCS(Source Code Control System)很象。但CVS的功能遠非僅此。它的大的特點是它的并發(fā)性,即它支持分布式項目的開發(fā)。在互聯(lián)網(wǎng)席卷一切的,這個功能太為重要了。小到一個辦公室內(nèi)部開發(fā)一個OA系統(tǒng),大到KDE小組利用互聯(lián)網(wǎng)開發(fā)新版本的KDE,CVS都可以一展身手。一個程序員開發(fā)出了自己負責模塊的新版本后,迅速的通過CVS讓開發(fā)組的每一個成員都分享自己的新成果。甚至,CVS通過特定的機制允許多個程序員同時修改同一個源程序文件。 另外CVS增強的目錄結(jié)構(gòu)以及對二進制文件良好的處理,都使得它遠遠優(yōu)于其它的版本管理系統(tǒng)。后,必須一提的是CVS是基于RCS開發(fā)而成的。
2.如何得到CVS?
CVS在幾乎包含在所有的Linux發(fā)布版本中,如RedHat、Turbo Linux、Slackware以及國產(chǎn)的紅旗、Xteam Linux等。你可以試著敲一下cvs命令,大多數(shù)情況下都會出現(xiàn)以Usage: cvs開頭的一堆信息,提示你如何使用cvs,這意味著在你的機器上早已有了CVS,只是遺憾的是它一直未被你發(fā)現(xiàn)和利用。運氣不好的話,你會看到形如cvs: Command not found.的提示,這意味著你的機器沒有安裝CVS。這時你有兩種選擇。一是找到你的Linux安裝盤,從那里安裝CVS。例如在使用RPM方式安裝的Linux(上面介紹的幾個發(fā)布版本中似乎除了Slackware,其他都是)發(fā)布版本中,找到cvs***.rpm,用rpm命令進行安裝。第二種方式是到一些站點cvs的源代碼,然后遵循里面附帶的指導進行安裝,需要的讀者請訪問站點http://www.cyclic.com/或者http://www.loria.fr/~molli/cvs-index.html。
3.CVS的基本使用方法
在這一節(jié)里,我們來學習掌握CVS的一些基本使用方法,F(xiàn)在我們假定已經(jīng)安裝好了CVS,并且我們打算用它來管理自己正在開發(fā)的一個軟件,軟件名叫netants,它存放在硬盤上一個叫做netants的目錄里,目前里面有了文件netants.c、netants.h、http.c、http.h和Makefile。我們并沒有和它人協(xié)作開發(fā)這個軟件,也沒有利用Internet或者Intranet來開發(fā)這個軟件。或許,它只是自己的一個業(yè)余作品,試圖寫出一個比Windows下的網(wǎng)絡(luò)螞蟻更好的下載工具出來。
3.1 初始化CVS
我們首先要使用的命令是cvs init,這個命令用來初始化CVS系統(tǒng)。正如我們所看到的,所有的CVS命令都以cvs開頭,然后在后面緊跟命令、參數(shù)和一些選項。初始化CVS系統(tǒng)主要是為了創(chuàng)建一個為CVS所使用的源碼儲存庫(repository)。創(chuàng)建的時候,需要指定在那個目錄下創(chuàng)建這個源碼儲存庫。有兩種方法來指定目錄。一是利用"-d <目錄路徑>"選項來指定,例如:-d /usr/local/cvsroot。另一種更方便的方法是在shell里設(shè)定一個名叫CVSROOT的環(huán)境變量。使用csh或者tcsh的用戶可以使用命令setenv來設(shè)定,在文件 .csh rc或者文件 .tcshrc里添加入下的一行:
setenv CVSROOT /usr/local/cvsroot
使用sh或者bash的用戶需要在文件 .profile或者文件 .bashrc里添加如下兩行:
CVSROOT=/usr/local/cvsroot
export CVSROOT
設(shè)置了環(huán)境變量CVSROOT后,我們運行命令cvs init,CVS將在指定的目錄下面建立自己所需要的一些文件,以后我們使用CVS管理的任何項目,都會被CVS儲存在這個目錄之下。不過千萬要注意的是:永遠不要去試圖修改這個目錄下的文件。這個目錄是由CVS自己進行管理的,輕率的改動可能會導致你丟失你部分或全部的交由CVS管理的源代碼或其他資源。
3.2 導入項目到CVS中去
初始化結(jié)束以后,我們要真正開始利用CVS來管理自己的程序網(wǎng)絡(luò)螞蟻了。第一步,我們將這個項目交由CVS管理。使用如下的CVS的import命令,將源程序?qū)氲紺VS的源碼儲存庫中去:
cd netants
cvs import -m "start my project: Netants" netants yoyo start
這個命令看起來有些復(fù)雜,需要解釋一下。import是cvs的導入命令,默認狀況下,它循環(huán)的將當前目錄下的所有文件(包括子目錄)導入到源碼庫(即CVSROOT指定的目錄)里去。-m "start my project: Netants"告訴CVS你對這一步操作的說明。這是CVS強制要求的,如果你沒有使用這種-m "字符串"的選項,CVS將會彈出一個文本編輯器(如果自己不特別指定的話,在Linux下一般是vi,而在Windows下則是Notepad),讓你輸入一些說明信息它才罷休。netants是這個項目被CVS存儲時的路徑名,即CVS將在創(chuàng)建一個$CVSROOT/netants的目錄,并在此目錄下存放此項目的文件,當然,它不是原封不動的存儲,CVS會做一番處理。后兩個字符串設(shè)定了兩個標記(tag),現(xiàn)在并沒有什么用處,但它們同樣是CVS指定必需的,所以我們添上這兩個參數(shù)。執(zhí)行此命令時,CVS自動將所有的文件版本設(shè)為1.1,這是它所認為的低版本。以下為執(zhí)行上述命令后的顯示信息: N netants/netants.c N netants/http.c N netants/http.h N netants/netants.h N netants/Makefile
No conflicts created by this import N表示New,CVS成功的加載了這些文件,并沒有發(fā)現(xiàn)沖突。
上面的命令稍長了一些,而且顯得有些繁瑣,相信我,CVS不總是這樣的,這點"繁瑣"相對它給我們帶來的便利是完全可以忽略不計的。
3.3 從CVS中導出項目
好了,我們把自己的netants的項目交給了CVS去管理,現(xiàn)在,我們完全可以刪除原有的存儲我們代碼的netants目錄(當然,安全起見,你或許應(yīng)該再做一次備份,并希望是后一次)。我們要進行開發(fā)工作了,建一個目錄,叫什么呢,叫worktmp吧。我們進到此目錄下,執(zhí)行命令cvs checkout netants,我們將會看到如下的信息: cvs checkout: Updating netants U netants/Makefile U netants/http.c U netants/http.h U netants/netants.c U netants/netants.h
CVS在當前目錄下建立一個叫做netants的目錄,我們原先的代碼文件都在這個目錄下出現(xiàn)了,而且還多了一個名為CVS的目錄。目錄CVS下面存放的是一些文本文件,記錄了CVSROOT的位置、此項目對應(yīng)源碼庫中那個目錄等一些信息。