原文: http://blog.chinaunix.net/uid-1877180-id-303395.html
檔案: 3-RCS與CVS.zip
大小: 11KB
下載下傳: http://blogimg.chinaunix.net/blog/upfile2/100812121919.zip
使用RCS/CVS來管理源代碼
1. RCS的使用
RCS(Revision Control System)即程式改版控制系統,主要功能是用來管理檔案的版本,可以節省空間和時間。這樣就不需要在每個程式開發到某一個階段就将資料拷貝到其他的地方備份起來了。
RCS提供了如下幾個最重要的指令:
Ø ci指令:将檔案放入RCS目錄下的控制系統
Ø co指令:從RCS目錄下将檔案取出
Ø rcs指令:用來對RCS檔案進行參數的設定
1.基本操作方式
一般而言,RCS所産生出來的檔案會放在RCS目錄中。是以第一步必須要在目前的目錄下制作一個檔案:
[[email protected] linux]# mkdir RCS
接下來隻要使用ci指令。就可以把檔案備份到RCS改版控制系統中:
[[email protected] linux]# ci test.c
若要将檔案取出,可以使用下列指令:
[[email protected] linux]# co test.c
取出來的檔案是隻讀檔案,若要取出可以寫入的工作檔案,可以加上-l參數來鎖定它:
[[email protected] linux]# co -l test.c
此外将檔案放入RCS控制系統時,可以使用-l參數鎖定檔案,那麼目錄下的檔案依然存在:
[[email protected] linux]# ci -l test.c
若要比較目前的檔案和RCS中最新版本的檔案,可以使用下列指令:
[[email protected] linux]# rcsdiff test.c
2.指定版本
若不指定版本編号時,co會從RCS取得最新的版本。如果要以特定的版本号碼寫入RCS或讀出,可以使用-r參數選項。
[[email protected] linux]# ci -l -r3.25 test.c
<--以3.25作為版本編号
[[email protected] linux]# co -l -r1.2 test.c
<--将RCS中1.2版的test.c讀出
此外,rcsdiff也可以用來指定任何一個版本和目前程式代碼進行比較。
[[email protected] linux]# rcsdiff -r3.25 test.c
<--取出3.25版與test.c進行比較
3.關鍵詞的使用
在RCS中可以将關鍵詞變量放入程式代碼中。這些變量經過RCS會變成版本的注解。使用者可以将這些關鍵詞說明當作是程式中的批注。
常用的關鍵詞如下:
$Author$:将版本放入RCS的使用者名稱。
$Data$:記錄程式代碼放入RCS時的日期和時間。
$Header$:記錄檔案的标頭,包括RCS路徑名稱、版本号碼、日期、作者等。
$ID$:和$Header$相同,但不包括RCS路徑名稱。
$Locker$:記錄鎖定本版本的使用者名稱。
$Log$:記錄将RCS鎖住的時間,所輸入的文本語句。
$RCSfiles$:記錄RCS檔案名稱。
$Rivision$:指定版本号碼。
$Source$:RCS檔案名稱,包括其路徑。
$State$:使用-s選項所指定的特殊狀态。
使用關鍵詞的步驟如下所示:
(1)在程式代碼中加入任一關鍵詞
[[email protected] linux]#vi test.c
(2)将程式代碼放入RCS版本控制系統
[[email protected] linux]# ci -l test.c
(3)将檔案再次取出。在取出的過程中,co會将每個關鍵詞展開成其對應的值
[[email protected] linux]# co -l test.c
[[email protected] linux]# cat test.c
2. CVS的使用
CVS(Concurrent Version System)是個版本控制系統,利用該系統可以記錄源代碼檔案的曆史。例如,當軟體修改時會産生Bug,并且可能在做這次修改後很長時間不會發現這些問題。使用CVS就可以容易地回顧老的代碼版本去發現哪一次的修改導緻這些問題。
如果CVS保留每一次的代碼版本,會浪費很多的空間。是以CVS使用一種比較聰明的辦法儲存多個版本在一個檔案中。它僅僅保留版本間的不同内容。如果很多人在同一個項目上工作,則CVS使用讓不同開發者獨立工作的方式解決了這個問題。每一個開發者的工作都在他自己的目錄内,并且CVS将在每個開發者的工作完成後進行合并工作。
在Linux下,CVS的使用一般是以指令行方式。通常,CVS有兩種使用方式,一是本機方式,一是遠端執行方式。CVS的指令格式是:
cvs [cvs的選項] cvs的動作 [選項]
讀者可以用cvs –H command列出指令command的使用方法。
1).開始項目
用CVS管理代碼,首先要建立一個“資訊倉庫”。“資訊倉庫”簡單來說包含一個目錄結構。它包括要管理的源代碼和用于管理源代碼的各種管理檔案。
先設定環境變量CVSROOT,指向資訊倉庫的絕對路徑,然後調用CVS的init指令:
# CVSROOT=/usr/local/cvsroot;export CVSROOT
# cvs init
# ls -l $CVSROOT
2).添加項目的檔案、目錄到資訊倉庫
要将需要管理的項目的檔案加入到資訊倉庫,并做上标志。如果從頭開始一個新的項目,就需要建立一個單獨的目錄,并把所有要使用的檔案做一個有效的組織。而如果在開始使用源檔案之前該目錄就已經存在,則隻需進入該目錄就行了。
然後,就可以輸入源檔案目錄:
# cvs import -m "Create Source Dir" myproject wu cvstest
這樣會生成 $CVSROOT/myproject 目錄。 其中-m用來指定注釋資訊,如果後面在指令行不指定注釋資訊,則會啟動預設編輯器(vi)要求輸入注釋資訊;myproject是項目名稱;wu, cvstest分别辨別了作者和發行辨別。
3).指令簡介
(1)導出源檔案
cvs checkout [-r rev][-D date][-d dir][-j merg1] [-j merg2] modules
-r 導出指定版本的子產品
-D 導出指定日期的子產品
-d 導出指定目錄而不是子產品
-j 合并目前版本和指定版本
使用下面的指令會導出剛才生成的子產品,并在目前目錄下生成與檔案倉庫中完全一樣的目錄結構:
# cvs checkout myproject
對于目錄結構比較複雜的子產品可以在 $CVSROOT/CVSROOT/modules中加以指定:
①# cvs checkout CVSROOT/modules
②在modules檔案中加入下面一行:
SOURCE myproject
③然後執行:
# cvs commit –m “Add SOURCE”
以後就可以使用下面的指令在目前路徑下生成myrpoject目錄
# cvs checkout SOURCE
在目前路徑下生成的這個目錄就被稱為工作目錄,對源檔案的所有修改都應該在這個目錄下完成,而絕對不允許去改動在檔案倉庫中$CVSROOT 目錄下的檔案。
(2)删除、增加、重命名檔案和目錄
cvs add [-k kflags][-m message] files...
-k 指定以後該檔案的預設導出目錄
-m 對檔案的描述
上述指令會加入一個新的檔案到檔案倉庫裡,但直到使用了送出指令它才會真正更新檔案倉庫。
cvs remove [options] files
上述指令會從檔案倉庫中删除檔案,但也要到送出之後才有作用。
(3)送出源檔案
cvs commit [-Rl][-m mesg] files
-R 連子目錄一起送出
-l 隻送出本地目錄(不送出子目錄)
-m 注釋資訊
在導出源檔案之後,在工作目錄中對源檔案進行的所有修改都必須在送出之後才能對檔案倉庫中的源檔案起作用,并且新的檔案才能夠被配置設定一個新的版本号。
(4)釋放工作目錄
cvs release –d SOURCE
這個指令會删除工作目錄 myproject(建議在送出了修改的子產品後執行這一步),比使用 rm –rf cvstest 要好。
4).多使用者開發
在多使用者的情況下,如果不同使用者修改的是同一個檔案的不同部分,則使用下面的指令就能進行版本合并(把檢出的檔案與目前的最新版本合并):
# cvs update
(1)沖突解決
在有多個使用者對同一個檔案進行修改時,如果修改了其中的相同部分,而修改後的内容如果有不同的話,出現沖突是不可避免的。如果在CVS 檔案倉庫中有一個檔案 test.c ,它的版本是1.4,使用者A 先檢出該檔案進行修改,而稍後有使用者B檢出該檔案進行修改,并提前送出成 1.5,而在使用者A再送出時就會出現沖突(如果檔案内容不同的話),這時CVS會提示需要手工解決。
(2)檔案版本管理
cvs log [-lR][-r rev][-d date][-w login][files…]
-l 不處理子目錄
-R 對子目錄做同樣處理
-r 指定版本号
-d 指定時間
-w 指定登入名
使用上面的指令可以參看目前子產品或指定檔案的所有曆史版本資訊。
cvs annotate [-lR][-r rev|-D date] files
-l 不處理子目錄
-R 對子目錄做同樣處理
-r 指定版本号
使用上面的指令可以參看指定檔案(檢出之後)的所有修改資訊。
使用下面的指令可以生成相對于一個指定主版本的分支版本:
cvs rtag –b –r rev_root rev_branch file_name
-b 指定生成一個分支版本
-r 指定該分支的主幹節點版本号
rev_root 主幹版本号
rev_branch 分支版本号
file_name 指定檔案,使用“.”表示目前目錄下所有檔案
使用上面的指令可以生成一個對應版本号的分支版本,由于CVS 版本号是用數字表示的,而且在同一個子產品下不同檔案的版本完全可能是不同的,是以使用辨別會更友善。
例:
# cvs rtag –b –r 1.2 tlb-1 SOURCE
以後要通路該分支版本,可以使用“-r” 選項
# cvs checkout –r tlb-1 SOURCE
從目前檢出的版本切換到一個分支版本:
# cvs update –r tlb-1 SOURCE
使用下面的指令可以看版本資訊:
cvs status [–vlR] files
-v 顯示所有資訊
-l 不顯示子目錄資訊
-R 顯示子目錄資訊
cvs update –j rev module
把目前所做的修改與指定版本的檔案進行合并。
如果在不同版本之間子產品的檔案有增減,則可以:
# cvs update –A
# cvs updata –jbranch_name
5).在遠端機器上使用CVS
通過網絡使用CVS 有很多種方式,但在這裡隻介紹比較簡單的一種:通過rsh 執行cvs 指令。
1) 在遠端機器的.rhosts中加入對本地機的通路許可:
tom huang
2) 使用下面的指令檢出子產品
# cvs –d :ext:[email protected]:/work/cvsroot checkout SOURCE
其中,ext 指明了連接配接方式為 rsh,huang指明了本地使用者,wyhlinux指明了遠地主機,/work/cvsroot 指明了在遠地主機上的$CVSROOT路徑,可以在本地設定CVS_SERVER環境變量指明這個目錄。