CVS使用簡介(轉)

post0發表於2007-08-11
CVS使用簡介(轉)[@more@]

這裡有一篇有關CVS的使用簡介,是我以前做專案時為

初學者翻譯的,本著“夠用”的原則翻的,還有很多精

華沒有翻出來,但作為一個入門進階是夠了。

CVS 使用簡介

============

CVS 是RCS的前端工具,它是用於多使用者並行開發的版本控制工具,它的最大特點是使用了“copy-modify-merge”機制而不是“lock- modify-unlock”。透過使用CVS生成一個儲存檔案的倉庫(repository),儲存在倉庫中的每個目錄叫做模組(module),在修改時將相應的模組檢出到工作目錄中(working directory)生成對應的目錄,所有的修改都在工作目錄中完成,修改完成後再提交到倉庫中生成新的版本號,並加以儲存。

1. CVS初始化

-------------

(1) 建立CVSROOT根目錄

編輯有關的環境變數,加入CVSROOT的定義(比如在 /etc/bashrc 檔案中加入下面兩行):

CVSROOT=/usr/local/cvsroot

export CVSROOT

然後在相應位置開始建立CVSROOT

$cd /usr/local/

$mkdir cvsroot

$cvs –d /usr/local/cvsroot init

這時就會產生/usr/local/cvsroot/CVSROOT 目錄,這下面放著有關CVS的配置檔案。同時/usr/local/cvsroot/也作為檔案倉庫存放所有的檔案。

(2) 建立開發專案

如果從頭開始一個新的專案,就需要建立一個單獨的目錄,並把所有要使用的檔案做一個有效的組織。而如果在開始使用原始檔的目錄之前就有了,則只需進入該目錄就行了。

$cd /work/tang

$ls cvstest

. .. c/

$cd cvstest

然後,就可以輸入原始檔目錄:

$cvs import –m “Create Source Dir” cvstest/c tang cvstest

這樣會生成 $CVSROOT/cvstest/c 目錄。 其中 -m 用來指定註釋資訊,如果後面在命令列不指定註釋資訊,則會啟動預設編輯器(vi)要求輸入註釋資訊。 tang, cvstest分別標識了廠商和發行標識。

注意,使用import命令會把當前目錄下的所有檔案和目錄(包括子目錄)引入到檔案倉庫中指定模組(目錄)下。

2. 命令簡介

-------------

(1) 檢出原始檔

cvs checkout [-r rev][-D date][-d dir][-j merg1] [-j merg2] modules

-r 檢出指定版本的模組

-D 檢出指定日期的模組

-d 檢出指定目錄而不是模組

-j 合併當前版本和指定版本

使用下面的命令會檢出剛才生成的模組,並在當前目錄下生成與檔案倉庫中完全一樣的目錄結構:

$cvs checkout cvstest/c

對於目錄結構比較複雜的模組可以在 $CVSROOT/CVSROOT/modules中加以指定:

1) $cvs checkout CVSROOT/modules

2) 在modules檔案中加入下面一行:

SOURCE cvstest/c

3) 然後執行:

$cvs commit –m “Add SOURCE”

以後就可以使用下面的命令在當前路徑下生成 cvstest/c 目錄

$cvs checkout SOURCE

在當前路徑下生成的這個目錄就被稱為工作目錄,對原始檔的所有修改都應該在這個目錄下完成,而絕對不允許去改動在 檔案倉庫中$CVSROOT 目錄下的檔案。

(2) 刪除、增加、重新命名檔案和目錄

cvs add [-k kflags][-m message] files...

-k 指定以後該檔案的預設檢出目錄

-m 對檔案的描述

上述命令會加入一個新的檔案到檔案倉庫裡,但直到使用了提交命令它才會真正更新檔案倉庫。

cvs remove [options] files

上述命令會從檔案倉庫中刪除檔案,但也要到提交之後才有作用。

例1:增加檔案

$cvs checkout SOURCE

$cd cvstest/c

$touch test.c

$cvs add test.c

$cvs commit –m “add test.c”

例2:刪除檔案

$cvs checkout SOURCE

$cd cvstest/c

$rm test.c

$cvs remove test.c

使用 –f 選項能上面兩步合做一步。

$cvs remove –f test.c

如果在提交之前想恢復剛才刪除的檔案,可以如下:

$cvs add test.c

如果只執行了第一步刪除(rm),則可以用下面的方法恢復:

$cvs update test.c

對於重新命名的檔案,可以先刪除再新增。

對於目錄的修改(重新命名),可能需要修改cvs 管理檔案,一般應該遵循以下步驟:

1) 確認所有有關的修改都已經提交;

2) 進入檔案倉庫中要修改的模組目錄,對相應的目錄進行修改(重新命名或刪除)

$cd $CVSROOT/modules

$mv old_dir new_dir

3) 如果有必要,修改管理檔案,比如modules 檔案

如果要刪除目錄,則應該先對目錄中每個檔案都進行了刪除(包括使用cvs remove )處理之後再執行上面的第2步。

(3) 提交原始檔

cvs commit [-Rl][-m mesg] files

-R 連子目錄一起提交

-l 只提交本地目錄(不提交子目錄)

-m 註釋資訊

在檢出原始檔之後,在工作目錄中對原始檔進行的所有修改都必須在提交之後才能對檔案倉庫中的原始檔起作用,並且新的檔案才能夠被分配一個新的版本號。

(4) 釋放工作目錄

cvs release –d SOURCE

這個命令會刪除工作目錄 cvstest/c (建議在提交了修改的模組後執行這一步), 它比使用 rm –rf cvstest 要好。

3. 多使用者開發

---------------

在多使用者的情況下,如果不同使用者修改的是同一個檔案的不同部分,則使用下面的命令就能進行版本合併(把檢出的檔案與當前的最新版本合併):

$cvs update

(1) 衝突解決

在有多個使用者對同一個檔案進行修改時,如果修改了其中的相同部分,而修改後的內容如果有不同的話,出現衝突是不可避免的。如果在CVS 檔案倉庫中有一個檔案 test.c ,它的版本是 1.4, 使用者A 先檢出該檔案進行修改,而稍後有使用者B 檢出該檔案進行修改,並提前提交成 1.5, 而在使用者A再提交時就會出現衝突(如果檔案內容不同的話),這時CVS會提示需要手工解決。

檔案倉庫中的版本1.4:

#include stdio.h

main()

{

int i;

for(i = 0; i < 100; i++)

printf(“Count: %d

”, i);

}

使用者B 1.5:

#include stdio.h

main()

{

int i;

for(i = 0; i < 10; i++)

printf(“Count: %d

”, i);

printf(“Over

”);

}

使用者A :

#include stdio.h

main()

{

int i;

for(i = 0; i < 50; i++)

printf(“Count: %d

”, i);

return;

}

提交時會提示有衝突,需要手工編輯,這時執行了$cvs update 之後再編輯test.c, 會看到:

#include stdio.h

main()

{

int i;

<<<<<<< test.c

for(i = 0; i < 50; i++)

=======

for(i = 0; i < 10; i++)

>>>>>>> 1.5

printf("Count: %d

", i);

<<<<<<< test.c

return;

=======

printf("Over

");

>>>>>>> 1.5

}

(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 annotate cvstest/c/test.c

輸出:

版本 修改人 修改時間 原始碼

1.1 (tang 18-Jan-00): #include stdio.h

1.1 (tang 18-Jan-00): #include string.h

1.1 (tang 18-Jan-00):

1.1 (tang 18-Jan-00): main()

1.1 (tang 18-Jan-00): {

1.1 (tang 18-Jan-00): int i = 0 ;

1.1 (tang 18-Jan-00):

1.1 (tang 18-Jan-00): for(i = 0; i < 20; i++)

1.1 (tang 18-Jan-00): printf("Count: %d

", i);

1.1 (tang 18-Jan-00):

1.3 (tang 18-Jan-00): printf("222222

");

1.4 (tang 18-Jan-00): printf("333333

");

1.1 (tang 18-Jan-00): }

使用下面的命令可以生成相對於一個指定主版本的分支版本:

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

把當前所做的修改與指定版本的檔案進行合併。

主幹 1.1  1.2  1.3  1.4  1.5  1.6

分支tlb-1  1.2.2.1  1.2.2.2  1.2.2.3

如果要合併分支tlb-1上的版本:

$cvs update –j 1.2.2.3 –j tlb-1 test.c

其中1.2.2.3可以透過tag命令生成一個容易記憶的標識。

如果要合併分支tlb-1到主幹上1.2 :

$cvs update –j tlb-1 test.c

如果要合併主幹上的不同版本(注意順序很重要,同時在指定版本之間的所有修改將被丟棄):

$cvs update –j 1.5 –j 1.2 test.c

如果在不同版本之間模組的檔案有增減,則可以:

$cvs update –A

$cvs updata –jbranch_name

4. 在遠端機器上使用CVS

----------------------

透過網路使用CVS 有很多種方式,但在這裡只介紹比較簡單的一種:透過rsh 執行cvs 命令。

1) 在遠端機器的.rhosts中加入對本地機的訪問許可:

tom tang

2) 使用下面的命令檢出模組ESMSTRG

$cvs –d :ext:tang@esmpro:/work/cvsroot checkout SOURCE

其中, ext 指明瞭連線方式為 rsh, tang 指明瞭本地使用者, esmpro 指明瞭遠地主機,/work/cvsroot 指明瞭在遠地主機上的$CVSROOT路徑,可以在本地設定CVS_SERVER環境變數指明這個目

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-944657/,如需轉載,請註明出處,否則將追究法律責任。