1. 安裝服務(wù)器
在unix/linux平臺上安裝CVS服務(wù)器
安裝是超級用戶執(zhí)行的。假設(shè)選擇一臺Linux服務(wù)器,假設(shè)主機名為hostcvs
進入目錄cvs-1.11.1p1,運行:
[root@hostcvs /root]$ ./configure
[root@hostcvs /root]$ make
root@hostcvs /root]$ make install
查詢是否安裝服務(wù)器
whereis cvs 查詢是否安裝cvs
下列操作均在服務(wù)器上進行
cvs倉庫(Repository)是保存軟件資源的設(shè)備,可以根據(jù)需要選擇一目錄作為庫的位置,如,/cvsap ,用超級用戶建相應(yīng)目錄。
mkdir /cvssrc
mkdir /cvssrc/master (建立目錄root/cvssrc/master)
2. CVS服務(wù)器的初始化
在確定CVS倉庫位置后,就可以初始化CVS服務(wù)器。在初始化的過程中CVS創(chuàng)建其文件系統(tǒng),并產(chǎn)生原始內(nèi)容
[root@hostcvs /root]$ cvs –d /cvssrc/master init 。
執(zhí)行命令:
[root@hostcvs /root]$ ls /cvssrc/master
結(jié)果: CVSROOT
3. 添加用戶組
添加cvsadmin用戶組
2)添加cvsuser用戶組
3)添加CVS管理員賬號到cvsadmin
4) 添加CVS普通用戶到cvsuser
5) 讓cvs管理員擁有對配置目錄及其下文件的讀寫權(quán)限,同時給cvs的普通用戶對配置目錄及其下文件的讀權(quán)限。
[root@cvshost /root]$ chgrp –R cvsadmin /cvsap/src/master/CVSROOT
[root@cvshost /root] $ chmod –R 064 /cvsap/src/master/CVSROOT
6) 給cvs普通用戶對目錄/cvsap/src/master/project的讀寫權(quán)限
[root@cvshost /root] $chgrp –R cvsuser /cvsap/src/master/project
[root@cvshost /root] $ chmod –R 060 /cvsap/src/master/project
rwx|rwx|rwx
每一個用戶都有它自身的讀、寫和執(zhí)行權(quán)限。第一套權(quán)限控制訪問自己的文件權(quán)限,即所有者權(quán)限。第二套權(quán)限控制用戶組訪問其中一個用戶的文件的權(quán)限。第三套權(quán)限控制其他所有用戶訪問一個用戶的文件的權(quán)限
drwxr-xr-x 2 root root 48 8月 12 22:25 MyMusic
d:表示是一個目錄,事實上在ext2fs中,目錄是一個特殊的文件
以下操作均在客戶端上進行
以下命令均在客戶端運行
import命令
從客戶端登陸服務(wù)器。在客戶端有目錄,如,test,其中有源文件和子目錄,將目錄test下的內(nèi)容加入服務(wù)器作為一個項目(如,project,test),即一個baseline。命令為:
your_client$ cvs import –m “initial import” test SSE start
該命令將當(dāng)前目錄(包含子目錄)下的所有內(nèi)容,都放進CVS系統(tǒng)中,其中,
-m 表示在命令中要加注釋內(nèi)容
test 為該項目名稱
SSE 為廠商標(biāo)識
start 為版本標(biāo)記
checkout命令
checkout命令是將我們選定的CVS服務(wù)器上指定倉庫中的一個項目代碼取到本地的工作目錄下。
如果要將倉庫中的test項目的代碼取到本地個人目錄下,執(zhí)行:
your_client$ cd $HOME
your_client$ cvs checkout test
diff命令
CVS能將你工作的拷貝中的源代碼文件與倉庫中的版本進行比較,發(fā)現(xiàn)差異。(45頁)如:
your_client$ cvs diff test.c
your_client$ cvs diff –c test.c
該命令能看到對照的結(jié)果。應(yīng)該注意的是顯示內(nèi)容中的“+”表示添加行,“!”表示修改,其余的顯示內(nèi)容和UNIX系統(tǒng)中的diff命令顯示相仿。
your_client$ cvs diff –r 1.1 –r 1. 2test.c
該命令比較庫中兩個不同版本文件差異
commit命令
提交操作會改變倉庫內(nèi)容。提交之后,代碼成為整個 系統(tǒng)的一個部分了。由于軟件的復(fù)雜性,需要對提交進行控制。所以在提交時應(yīng)當(dāng)遵循一定的流程,進行一定的軟件質(zhì)量保證(SQA)工作,這些工作包括評審(review)、提交報告等。
提交源代碼的命令為:
your_client$ cvs commit –m “add string variable and header string.h” test.c
注意:如果提交失敗,此時應(yīng)該用update命令更新個人工作目錄下的源代碼。
update命令
該命令既可針對單個文件,也可針對一個目錄,或者整個項目.
更新單個文件
your_client$ cvs update test.c
執(zhí)行上述命令后,用戶當(dāng)前工作目錄中的文件test.c的內(nèi)容與倉庫中的最新版本完全相同了,因為在你checkout該文件后,在修改該文件的過程中可能他人已經(jīng)修改并提交了該文件,即你的修改不是基于庫中最新版本。所以,你必須先update,再提交該文件才能提交成功。不過可能有沖突要解決,原因是對同一個文件的同一處代碼進行了不同的修改。解決沖突的辦法就是通過編輯文件,修改發(fā)生沖突的部分。對于邏輯問題CVS無法發(fā)現(xiàn),所以版本沖突的處理應(yīng)該與軟件開發(fā)中的需要相結(jié)合。另外,可以通過more命令看以下合并后的文件,如,more test.c
更新整個項目
your_client$ cvs update
執(zhí)行上述命令后,用戶當(dāng)前工作拷貝中屬于本項目的所有文件與倉庫中的最新版本完全相同了
log命令
每次提交一個CVS操作時,必須填寫日志信息,否則拒絕提交。日志信息可以在命令行中加“-m”參數(shù)表示。如果日志過長,可以不用“-m”參數(shù)而直接運行,CVS會彈出一個編輯器,讓用戶在編輯器中輸入注釋信息。CVS對注釋信息沒有長度限制。這種日志信息是CVS進行軟件變化跟蹤的一種機制。
每個版本均有日志信息。用戶可以查看某個文件的全部歷史日志記錄,也可以指定查看某個版本或某個日期的日志記錄。查看日志信息使用命令:cvs log(53頁) 。
查看文件test.c全部日志,使用命令:
your_client$ cvs log test.c
查看test.c文件1.2版本的日志,使用命令:
your_client$ cvs log –r1.2 test.c
再如:cvs log –d“2002-06-01<2002-07-01;2002-08-01<2002-09-01”
status 命令
該命令是查看已經(jīng)checkout出來的文件信息,如 :
your_client$ cvs status test.c
your_client$ cvs status –v test.c(同時能查看tag 和branch)
your_client$ cvs status –v (查看所有文件的tag和branch)
版本回退
如果用戶提交了一個錯誤的版本,而不希望錯誤的版本是當(dāng)前最新版本,一個簡單的方法就是回退。
用命令:命令假設(shè),錯誤版本號為1.3,正確版本號為1.2
your_client$ cvs update –j 1.3 –j 1.2 test.c
將1.3版本與1.2版本之間的差異補到1.3版本上去
your_client$ cvs status test.c
查看checkout出的1.3版本的狀態(tài)(已經(jīng)在本地修改)
your_client$ cvs commit –m “reverted to revision 1.2” test.c
your_client$ cvs diff –r 1.2 –r 1.3 test.c
add命令
將工作目錄中新加的目錄和文件添加到cvs庫中的方法:
在工作目錄中創(chuàng)建目錄和文件后才能進行。
添加文件需兩步:
加文件的第一步:
your_client$ cvs add newfile
執(zhí)行第二步:
your_client$ cvs commit –m “added” newfile
添加文件夾只需一步 (不管目錄是否為空目錄)
your_client$ cvs add newdir
注意:但是目錄中的文件需要分別加入
remove命令
刪除文件
your_client$ cvs remove –f oldfile
your_client$ cvs commit –m “removed” oldfile
刪除文件夾
因為cvs不對目錄進行版本控制,所以和刪除文件不同,沒有一個專門的命令。例如(要刪除目錄olddir):
your_client$ ls -a
olddir test.c test1.c test.pc
your_client$ cd olddir
your_client$ ls –a
tmp.c tmp1.c
以下是刪除目錄olddir的命令:
your_client$ cvs remove –f tmp.c tmp1.c
Your_client$cvs commit –m “removed” tmp.c tmp1.c
your_client$ cd ..
your_client$ cvs update –P (更新, -P 告知 cvs update將空目錄由庫存中刪除)
your_client$ cvs update(所有空目錄均從工作目錄中刪除)
這時目錄olddir從工作目錄中消失(注意前提是將olddir中的文件全部刪除)
注意:此命令不會將庫中新添加的目錄取到工作目錄中,可執(zhí)行命令:your_client$ cvs update -d
高級主題
版本標(biāo)簽(tag)
版本標(biāo)簽是符號化的版本號碼,具有直觀、易于記憶和管理的優(yōu)點。用于階段式(里程碑)的版本標(biāo)記。是連接項目中不同文件不同版本的手段。
標(biāo)簽的設(shè)定
[Du_cloud@linux test]$ cvs tag rel_1_0_1 test.c
給test.c打上標(biāo)簽rel_1_0_1
注意:很少給單個文件設(shè)標(biāo)簽。
給目錄下所有文件貼標(biāo)簽:(選中目錄)
[Du_cloud@linux test]$ cvs tag baseline_1
刪除:
[Du_cloud@linux test]$ cvs tag –d baseline_1
重命名:
[Du_cloud@linux test]$ cvs tag –r baseline_1 baseline_2
(先重命名再進行刪除原標(biāo)簽)
[Du_cloud@linux test]$ cvs tag –d baseline_1
移動:
[Du_cloud@linux test]$ cvs tag –r 1.6 –F baseline_1 test.c
這里我們將test.c的標(biāo)簽從舊版本1.5移到新版本1.6上。
給 cvs tag 加上 `-c' 選項。如果有任何本地修改過了的文件,cvs 在其打標(biāo)簽之前將給出錯誤信息而退出:
$ cvs tag -c rel-0-4
cvs tag: backend.c is locally modified
cvs [tag aborted]: correct the above errors first!
按約定貼標(biāo)簽(倉庫中直接給模塊加標(biāo)簽)
按日期貼標(biāo)簽(下例是將模塊test的所有文件在20030624號0時0分前提交的最后一個版本貼上標(biāo)簽:
[Du_cloud@linux test]$ cvs rtag –D 20030624 nightly_20030624 test
按版本號、已經(jīng)有的標(biāo)簽貼新標(biāo)簽
[Du_cloud@linux test]$ cvs rtag –r old_20030624 new_rel_2_1 test(貼新標(biāo)簽但test下新加程序不掛到標(biāo)簽上)
[Du_cloud@linux test]$ cvs rtag –f nightly_20030624 test(將test下新加的程序的最新版本強制的掛到nightly_20030624上)
注意:cvs rtag –f 只和cvs rtag –r 或 cvs rtag –D 配合使用
[Du_cloud@linux test]$ cvs rtag –r 1.5 rel_2_1 test
[Du_cloud@linux test]$ cvs rtag –f 1.5 rel_2_1 test
附著性標(biāo)簽(sticky tags)
1)引起附著性標(biāo)簽的命令有:
cvs update –r tag
cvs update –D date(更新到不晚于date的最新版本)
cvs update –r x.y
cvs checkout –r tag
cvs checkout –D date (date之前最近的版本)
cvs checkout –r x.y
這種附著性標(biāo)簽主要用在:
1)版本分支:版本分支標(biāo)簽在創(chuàng)建分支的時候與版本分支關(guān)聯(lián)在一起,并且在解除之前一直有效。
2)保持某幾個文件不改動:有時候可能需要保持某幾個文件目前版本一段時間,可以用cvs update –r,命令為文件建立附著性標(biāo)簽,以后在這個目錄下執(zhí)行cvs update命令,該文件都不會被修改。
例子:
只要對幾個文件執(zhí)行了cvs update –r 命令,如:cvs update –r 1.28 ax.c則版本1.28就會成為附著性標(biāo)簽,以后執(zhí)行cvs update 命令時這個文件不會更新,直到解除附著性為止。
類似的,如果開發(fā)者希望檢出某個日期時間點上的版本,而不希望后來執(zhí)行cvs update的時候,這幾個文件被更新,就可以用cvs checkout –D 或者cvs update –D 來達到將該日期與該版本關(guān)聯(lián)的目的。
解除附著性標(biāo)簽:
[Du_cloud@linux test]$ cvs update –A test.c
該命令解除附著性標(biāo)簽,將checkout主干的最新版本并放本地
如何獲得某個特定的版本
§ 根據(jù)版本號碼或版本標(biāo)簽獲得
[Du_cloud@linux test]$ cvs update –r 1.1 test.c
獲得某一版本標(biāo)簽的整個軟件的源代碼:
[Du_cloud@linux test]$ cvs checkout –r baseline_1 test
或者跳轉(zhuǎn)到某個版本標(biāo)簽的版本(已經(jīng)有工作拷貝的情況下)
[Du_cloud@linux test]$ cvs update –r baseline_1
§ 根據(jù)時間獲得特定版本(更新到不晚于date的最新版本)
[Du_cloud@linux test]$ cvs update –D “2002-05-08”
版本分支
[Du_cloud@linux test]$ cvs co –d test_new –r base_1 test
將標(biāo)簽base_1 下的文件checkout到 新建目錄 test_new下
[Du_cloud@linux test_new]$ cvs tag –b New_Branch,
在標(biāo)簽base_1下建立分支New_Branch
[Du_cloud@linux test_new]$ cvs up –r New_Branch,(可以在分支中修改程序如:test.c) (進入分支New_Branch,進入之后可以在分支上修改文件) 1.1.2 變成1.1.2.1
[Du_cloud@linux test_new]$ cvs ci –m “fixed bug no 111” test.c(提交到分支上)
[Du_cloud@linux test]$ cvs up –j base_1_brh(分支版本合并到主干版本中)
[Du_cloud@linux test]$ cvs ci –m “merged from branch:base_1_brh”
發(fā)布代碼
cvs export –r rel_1_0_1 –d test_release1(新建文件夾) test(發(fā)布的文件所在目錄) (選定文件夾以作為新建文件夾的父目錄
關(guān)于二進制文件的入庫
§ CVS在處理文本類型的文件,包括各種源代碼文件、HTML、XML文件等。CVS對文本類型的文件進行版本管理時,會對文件做一些秘密的處理,在客戶端和UNIX倉庫之間,CVS會自動進行回車、換行替換和關(guān)鍵字擴展處理。
§ CVS對二進制文件的管理和保存:
1)在CVS系統(tǒng)中保存二進制文件,應(yīng)該使用“-kb”選項來禁止CVS對文件進行回車、換行替換和關(guān)鍵字擴展的加工。這個選項只需要在cvs add 命令中使用,本選項是一個附著性選項(如果沒有附著性每次執(zhí)行cvs命令時都需要這個選項)。
如:cvs add –kb binfile
cvs commit –m “added binfile” binfile
注意:二進制文件是原封不動的保存在倉庫中,不能按照增量方式保存兩個版本的差異,而是累加。