CVS (Cuncurrent Versions System)是基于TCP/IP協(xié)議的版本控制工具,也是Open source界重要的開(kāi)發(fā)工具之一。
它原來(lái)主要工作在UNIX平臺(tái)下,現(xiàn)在在windows平臺(tái)上也出現(xiàn)了很多GUI工具。
關(guān)于其由來(lái),發(fā)展,請(qǐng)參閱http://www.redsaga.com/CVS_newbie_win32/www.cvshome.org。
CVS和其他大部分版本控制軟件一樣,是Client/Server結(jié)構(gòu)的。你必須在本地為CVS repository準(zhǔn)備好一個(gè)目錄,來(lái)和服務(wù)器同步源代碼。
和在Windows 開(kāi)發(fā)平臺(tái)中擁有很大用戶群的Visual Source Safe(VSS)相比,CVS主要由兩個(gè)不同之處。
一是VSS依靠服務(wù)器上的一個(gè)共享目錄提供服務(wù),每一個(gè)client必須能夠訪問(wèn)這個(gè)共享目錄。這也決定了source safe在TCP/IP環(huán)境下使用很困難。對(duì)于分布跨越數(shù)個(gè)城市甚至的工作小組來(lái)說(shuō),只有通過(guò)VPN才能夠安全的訪問(wèn)source safe數(shù)據(jù)庫(kù)。(SourceGear公司(www.sourcegear.com)發(fā)售名為SourceOffSite的商業(yè)軟件包,US$239 per user,也可以為遠(yuǎn)程用戶提供通過(guò)TCP/IP訪問(wèn)source safe數(shù)據(jù)的能力。) 而CVS依靠TCP/IP連接提供服務(wù),所以它天生是為了在internet上協(xié)同工作而設(shè)計(jì)的。雖然基本的pserver連接安全性不是很高,但是通過(guò)使用SSH,可以獲得很高的安全性。
二是CVS反對(duì)對(duì)文件上鎖的機(jī)制。VSS以及其他很多傳統(tǒng)版本控制工具要求一個(gè)文件只能有一個(gè)使用者,它必須先checkout聲明編輯文件的獨(dú)享權(quán)力,直到checkin為止。但是對(duì)于地理上不限制使用者位置的CVS來(lái)說(shuō),等待一個(gè)用戶checkin是一件痛苦的事情,而互相溝通比一個(gè)緊密工作的團(tuán)體更困難。CVS采取多個(gè)用戶可以同時(shí)對(duì)一個(gè)文件進(jìn)行編輯,然后commit的方式解決這個(gè)問(wèn)題。假設(shè)由于溝通不足出現(xiàn)沖突,使用者必須手工解決沖突之后再進(jìn)行commit。在這種情況下,沖突的開(kāi)發(fā)者必須努力進(jìn)行足夠的溝通以避免再次沖突。
CVS服務(wù)器可以被配置為把commit記錄自動(dòng)張貼到新聞組或者開(kāi)發(fā)者的email信箱中去。注意這些輔助記錄將有助于開(kāi)發(fā)者之間的合作。
2, repository,module
CVS服務(wù)器上,一個(gè)源代碼倉(cāng)庫(kù)被稱為一個(gè)repository,一個(gè)server上通常可以運(yùn)行多個(gè)repository,每個(gè)repository都是完全獨(dú)立的,可以有不同的用戶列表和訪問(wèn)規(guī)則。在一個(gè)repository之下,文件按照module組織,每一個(gè)module相當(dāng)于一個(gè)工程,大致上相當(dāng)于Source safe里面的project。
VSS在你連接上服務(wù)器之后,會(huì)列出所有的project。但并不是所有的CVS server都會(huì)提供module的列表。事實(shí)上,哪些module被公開(kāi)是由管理員控制的。如果你知道一個(gè)被隱藏的module的名字,你仍然可以正常的訪問(wèn)這個(gè)module。
3,CVSROOT
CVS依靠運(yùn)行在服務(wù)器上的一個(gè)服務(wù)程序提供TCP/IP的連接。為了訪問(wèn)一個(gè)CVS數(shù)據(jù)庫(kù),你必須知道你所使用的協(xié)議,服務(wù)器的地址,服務(wù)器提供的Repository的名稱以及你的用戶名和密碼。
有數(shù)種協(xié)議可供選擇。Unix/Linux機(jī)器上的CVS通常使用pserver協(xié)議,這是一種不非常安全的協(xié)議,但是如果你有額外的安全要求,可以通過(guò)SSH進(jìn)行增強(qiáng)。除此之外,NT機(jī)器還支持ntserver協(xié)議,它通過(guò)主機(jī)的NT用戶表進(jìn)行訪問(wèn)控制(但是這是在internet上不可用的方法)。kserver和gserver協(xié)議用的比較少,他們依據(jù)Kerboses提供額外的安全保護(hù)。
你有必要知道CVSROOT這個(gè)參數(shù)。CVSROOT是一個(gè)用":"開(kāi)始及分隔各個(gè)部分的字符串,它包含了協(xié)議、用戶名、服務(wù)器地址和repository名稱。對(duì)于用戶來(lái)說(shuō),CVSROOT像URL一樣,是訪問(wèn)一個(gè)server的途徑。
一個(gè)典型的CVSROOT=:perser:cao@61.155.107.187:/cvs。這里,pserver是協(xié)議名稱,cao是用戶id,61.155.107.187是主機(jī)ip,/cvs是repository的名字。NT主機(jī)的repository一般會(huì)采取d:/CVSROOT之類的格式。
另一個(gè)例子是:pserver:anonymous@jivesoftware.com:/cvs,這是jivesoftware公司提供的開(kāi)放源代碼java技術(shù)論壇的CVSROOT。
在windows下使用命令行方式,這個(gè)參數(shù)可以通過(guò)一個(gè)環(huán)境變量使用。在windows 2000/XP系統(tǒng)中,你可以通過(guò)在'My computer'的properties中選擇advanced,然后選擇'Enviroment Variables'來(lái)輸入這個(gè)環(huán)境變量。
4,checkout,update
為了得到module下面的源代碼,你只需要使用checkout指令。和Visual source safe不一樣,checkout只是取得文件,而非鎖文件。
如果你已經(jīng)有了本地文件,為了和server保持同步,你需要進(jìn)行update操作。update會(huì)自動(dòng)把server上的新內(nèi)容取到本機(jī)來(lái),如果你本地文件進(jìn)行過(guò)了改動(dòng),它會(huì)幫您做合并工作。
checkout 和 update既可以針對(duì)一個(gè)特定的文件,也可以針對(duì)一個(gè)目錄或者整個(gè)module。
5, commit
如果你對(duì)本地代碼做了任何修改,或者增加一個(gè)文件,刪除一個(gè)文件,每當(dāng)你需要把你的改變提交到server上的時(shí)候,你需要做commit動(dòng)作。假設(shè)兩個(gè)人都在本地修改了同一個(gè)文件,那么他們像在進(jìn)行一個(gè)競(jìng)賽,如果你快,那么你贏了。后commit的人將被server拒絕,不得不合并你的修改再次提交。
commit既可以針對(duì)一個(gè)特定的文件,也可以針對(duì)一個(gè)目錄或者整個(gè)module。
6, revision
Revision是指每一個(gè)文件的版本信息。當(dāng)你第一次增加一個(gè)文件到repository的時(shí)候,它會(huì)有一個(gè)初始revision是1.1,以后每次提交,會(huì)增加到1.2,1.3...
在一個(gè)branch中的文件,有相對(duì)于這個(gè)branch的版本號(hào)。如果你對(duì)文件作了tag,那么你會(huì)看到revision變成1.1.1.1的形式。具體的含義我們?cè)赽ranch和tag的時(shí)候描述。
7,branch
Branch是一棵正常生長(zhǎng)的代碼樹(shù)中的枝杈。開(kāi)始的時(shí)候,任何一個(gè)module都有一個(gè)主枝被稱為'HEAD'。
一個(gè)branch終要么被合并到主干中去,要么被結(jié)束。branch通常用來(lái)debug,如果這個(gè)bug被fix了,修改bug的代碼應(yīng)該被合并到主枝上去。一個(gè)branch也可能經(jīng)歷多次與主枝的合并。
8, tag
Tag用來(lái)進(jìn)行標(biāo)示必要的信息。當(dāng)您進(jìn)行一次公開(kāi)發(fā)布之前,您有必要對(duì)主枝標(biāo)示"release 1.0"。這樣您以后可以隨時(shí)回到這個(gè)版本。
//to do: 請(qǐng)完善這里的描述
CVS命令行
在得到CVSROOT和你的口令之后,你可以試著登陸了。
首先,由于其他所有的GUI工具都是基于CVS基本協(xié)議的,而且他們可能會(huì)提供CVS的命令行或者等價(jià)形式作為顯示的一部分,所以你應(yīng)該對(duì)命令行操作有所了解。如果你還沒(méi)有一個(gè)cvs。exe的命令行程序,從http://www.redsaga.com/CVS_newbie_win32/www.cvsnt.org你可以得到一個(gè)cvsnt的下載連接,其中包含了一個(gè)命令行的cvs.exe程序。我們先從它開(kāi)始(為了作為一個(gè)client使用,你不需要安裝cvsnt的server組件)。CVSNT的cvs.exe是專門為windows編寫的,你需要把cvs.exe放在你的path里面。
1.進(jìn)入命令行方式。
和VSS一樣,你也需要在本地有一個(gè)工作目錄對(duì)應(yīng)于一個(gè)repository。假設(shè)這個(gè)目錄是'd:workssandbox'。請(qǐng)切換到這個(gè)目錄。
輸入"cvs"。你會(huì)看到:
這些提示信息告訴您關(guān)于cvs的基本語(yǔ)法。cvs后面跟著的是全局參數(shù),然后是命令,后是命令的參數(shù)。
2.login
正確的login不會(huì)有任何輸出,否則會(huì)告訴你錯(cuò)誤原因。
cvs
3.下面我們看看這個(gè)CVS server中有哪些module。
4.假設(shè)現(xiàn)在我們工作的項(xiàng)目是projectX,下面我們需要得到它下面的全部文件。