使用CVS進(jìn)行項(xiàng)目開(kāi)發(fā)管理
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/2/17 16:40:52 ] 推薦標(biāo)簽:
CVS在每個(gè)目錄下面都建立了一個(gè)名叫CVS的目錄,此外,目錄的結(jié)構(gòu)是一樣的,事實(shí)上,CVS目錄中存放的是一些關(guān)于目錄結(jié)構(gòu)在倉(cāng)庫(kù)中的信息,Entries中包含了這些目錄中的子目錄,Respository包含此目錄在倉(cāng)庫(kù)中的相對(duì)位置,ROOT包含導(dǎo)出的模塊主目錄的路徑。
cvs import命令只是在第一次把項(xiàng)目導(dǎo)入CVS倉(cāng)庫(kù)時(shí)才使用,以后如果再需要加入目錄或者加入文件,則使用cvs add 命令加入,然后使用cvs commit提交之后,文件或者目錄才會(huì)真正加入到CVS倉(cāng)庫(kù)中。我們可以把剛才編輯的hello.c文件拷貝到testprj/src/main/中,然后使用:
[kerberos@power zhyf]$ cvs add testprj/src/main/hello.c
cvs add: scheduling file `testprj/src/main/hello.c' for addition
cvs add: use 'cvs commit' to add this file permanently
使用cvs commit提交修改
[kerberos@power zhyf]$ cvs commit
cvs commit: Examining testprj
cvs commit: Examining testprj/admin
cvs commit: Examining testprj/doc
cvs commit: Examining testprj/include
cvs commit: Examining testprj/libs
cvs commit: Examining testprj/src
cvs commit: Examining testprj/src/include
cvs commit: Examining testprj/src/main
RCS file: /home/zhyf/cvsroot/testprj/src/main/hello.c,v
done
Checking in testprj/src/main/hello.c;
/home/zhyf/cvsroot/testprj/src/main/hello.c,v <-- hello.c
initial revision: 1.1
使用RCS管理單個(gè)文件
done
testprj/src/main/hello.c
由于CVS使用RCS管理單個(gè)文件,所以,前面我們講的關(guān)于RCS的知識(shí)也可以用到這里,不同的是命令之前要限定是cvs,比如cvs ci, cvs co, cvs diff, 或者在導(dǎo)出時(shí)使用 -r 選項(xiàng)指定導(dǎo)出的文件的版本。在源代碼文件中,同樣也可以使用RCS的關(guān)鍵字。
對(duì)于非ASCII文件,如二進(jìn)制可執(zhí)行文件,位圖等文件,我們不能直接使用cvs add加入到CVS倉(cāng)庫(kù)中,因?yàn)镃VS只是基于ASCII代碼比較文件的改變,所以,對(duì)于二進(jìn)制文件,如果單純使用cvs add 命令會(huì)破壞文件的完整,所在加入二進(jìn)制文件時(shí),要指定-kb參數(shù)。如果對(duì)已有文件進(jìn)行了修改,使用cvs ci, cvs commit 來(lái)提交修改。
另外一種情況是自己導(dǎo)出別人修改的文件,而不想覆蓋自己所作的修改,可以使用cvs update命令,這個(gè)命令會(huì)自動(dòng)比較CVS倉(cāng)庫(kù)中文件和當(dāng)前自己文件的后修改時(shí)間來(lái)導(dǎo)出新的文件。
在cvs update 和cvs ci 時(shí),你對(duì)此的文件修改與他人發(fā)生沖突,CVS則提示你。CVS會(huì)在文件中使用“>>>>>>” 或者“<<<<<<<”標(biāo)記標(biāo)出沖突的地方,你可以與他人協(xié)商手動(dòng)修改這一段代碼。
如果你想刪除倉(cāng)庫(kù)中的一個(gè)文件,要先刪除本地導(dǎo)出的文件,然后使用cvs remove 文件名, cvs commit來(lái)刪除。事實(shí)上,CVS是不會(huì)真正刪除這些文件的,如果你還想得到這些文件,只需要,使用cvs co -r 指定刪除前的版本導(dǎo)出可以了。
有時(shí)候?yàn)榱藢?dǎo)出CVS倉(cāng)庫(kù)中的深層目錄或者文件不得不輸入很長(zhǎng)的路徑,這一點(diǎn)很討厭,你可以導(dǎo)出CVS倉(cāng)庫(kù)中CVSROOT目錄下,修改modules文件,定義這個(gè)目錄或者文件為一個(gè)模塊,提交修改后可以直接使用cvs co 模塊名 可以導(dǎo)出了。
CVS的版本控制功能主要體現(xiàn)在tag上。標(biāo)記的作用如同是同時(shí)記錄了做標(biāo)記時(shí)所有文件的版本,需要的時(shí)候可以一次導(dǎo)出這些版本不一的文件,這常常是在項(xiàng)目的開(kāi)發(fā)達(dá)到了一定的目標(biāo)時(shí)使用的。
cvs tag 命令的參數(shù)只有一個(gè):標(biāo)記名。例如:
cvs tag RELEASE_1.0_BETA
以后,如果需要這個(gè)版本,只需要使用cvs co -r RELEASE_1.0_BETA可以導(dǎo)出這個(gè)版本了;蛘呤褂胏vs diff -r 來(lái)生成patch文件和使用cvs log -r 來(lái)查看這個(gè)版本的日志。
標(biāo)記的另外一個(gè)非常重要的作用是生成分支和合并分支。
通常,我們的項(xiàng)目的開(kāi)發(fā)到某一定的程度時(shí),需要探索某一條開(kāi)發(fā)途徑是否有效,這個(gè)時(shí)候,我們需要做一個(gè)試驗(yàn),但是這個(gè)試驗(yàn)的分支的開(kāi)發(fā)不能影響項(xiàng)目的主開(kāi)發(fā)分支,這樣,我們可以生成一個(gè)分支開(kāi)發(fā),主開(kāi)發(fā)分支也可以繼續(xù)進(jìn)行,兩者并不沖突,將來(lái)如果證明分支開(kāi)發(fā)有效,還可以把分支合并到主開(kāi)發(fā)分支中。建立一個(gè)CVS分支:
cvs tag -b 分支標(biāo)記名
建立分支后,并不影響當(dāng)前我們從CVS倉(cāng)庫(kù)中的文件,需要從CVS倉(cāng)庫(kù)中重新導(dǎo)出分支BRANCH_VER:
cvs co -r 分支標(biāo)記名 模塊名
這樣,我們可以進(jìn)行分支開(kāi)發(fā),主分支的開(kāi)發(fā)也可以照常進(jìn)行,如果此分支開(kāi)發(fā)成功,我們可以把它與主分支合并:
cvs update -j 分支標(biāo)記名
cvs commit
可以把開(kāi)發(fā)分支合并到主分支中去了。
以上是本地CVS倉(cāng)庫(kù)的操作,如果使用網(wǎng)絡(luò)CVS倉(cāng)庫(kù),只需要使用CVS_RSH環(huán)境變量指定通信shell,另外設(shè)置CVS倉(cāng)庫(kù)為網(wǎng)絡(luò)倉(cāng)庫(kù)可以了。網(wǎng)絡(luò)上的CVS倉(cāng)庫(kù)的服務(wù)器有兩種:ext和dserver。對(duì)于后者在進(jìn)行CVS操作時(shí),需要先login驗(yàn)證用戶(hù)。后者使用rlogin驗(yàn)證,不需要顯式登陸。如:
ext CVS 服務(wù)器使用
export CVSROOT=:ext:kerberos@power:/home/repository
或者cvs -d :ext:kerberos@power:/home/repository
cvs co platoon
derser CVS 服務(wù)器使用
export CVSROOT=:pserver:anonymous@anoncvs.kde.org:/home/kde
cvs login
cvs co kdebase
其他一些常用的cvs 命令選項(xiàng)
-d 指定CVS倉(cāng)庫(kù)的路徑
-zn 使用gzip 壓縮后傳輸,到本地后自動(dòng)解壓。n為壓縮級(jí)別通常式 1~4,通常使用于服務(wù)器的傳輸速度較慢的情況下。
-x 用于服務(wù)器的通信使用加密算法,只有在使用kerberos驗(yàn)證體系下有效
CVS 的GUI工具
幾個(gè)常用的GUI工具:
LinCVS(圖1),是Xwindow 的CVS客戶(hù)端工具,比較流行的一個(gè),功能也很強(qiáng)大.