2010年12月9日 星期四

[Linux 教學] 迅速掌握Linux下CVS服務器的安裝與配置

轉載自 這裡 
前言 : 
這裡有一篇有關CVS的使用簡介,是我以前做項目時為初學者翻譯的,本著“夠用”的原則翻的,還有很多精華沒有翻出來,但作為一個入門進階是夠了. 
- CVS 使用簡介 
CVS 是RCS的前端工具,它是用於多用戶並行開發的版本控制工具,它的最大特點是使用了“copy-modify-merge”機製而不是“lock- modify-unlock”。 通過使用CVS生成一個存儲文件的倉庫(repository),存儲在倉庫中的每個目錄叫做模塊(module),在修改時將相應的模塊檢出到工作目錄中(working directory)生成對應的目錄,所有的修改都在工作目錄中完成,修改完成後再提交到倉庫中生成新的版本號,並加以保存. 

CVS初始化 : 
- 創建CVSROOT根目錄 
編輯有關的環境變量,加入CVSROOT的定義(比如在/etc/bashrc 文件中加入下面兩行): 

CVSROOT=/usr/local/cvsroot
export CVSROOT

然後在相應位置開始創建CVSROOT 
$cd /usr/local/
$mkdir cvsroot <建立 Repository 的目錄>
$cvs –d /usr/local/cvsroot init <進行 Repository 初始化>

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

- 創建開發項目 
如果從頭開始一個新的項目,就需要創建一個單獨的目錄,並把所有要使用的文件做一個有效的組織。 而如果在開始使用源文件的目錄之前就有了,則只需進入該目錄就行了. 
linux-tl0r:/work/john # ls cvstest/ <檢查開發目錄下內容>
c
linux-tl0r:/work/john # cvs import -m "Create Source Dir" ./cvstest/c john cvstest <進行cvs Import, "john" 為 廠商, "cvstest" 為發行標識>
cvs import: Importing /home/cvsroot/./cvstest/c/cvstest
cvs import: Importing /home/cvsroot/./cvstest/c/cvstest/c

No conflicts created by this import
linux-tl0r:/work/john # ls /home/cvsroot/ | grep cvs <檢查 Repository 下是否正常 import 進去 cvstest>
cvstest <成功生成 module 目錄>

這樣會生成/home/cvsroot/cvstest/c 目錄。 其中-m 用來指定註釋信息,如果後面在命令行不指定註釋信息,則會啟動缺省編輯器(vi)要求輸入註釋信息。 john, cvstest分別標識了廠商和發行標識. 
注意,使用import命令會把當前目錄下的所有文件和目錄(包括子目錄)引入到文件倉庫中指定模塊(目錄)下. 

命令簡介 : 
- 檢出源文件 
cvs checkout [-r rev][-D date][-d dir][-j merg1] [-j merg2] modules 
-r 檢出指定版本的模塊
-D 檢出指定日期的模塊
-d 檢出指定目錄而不是模塊
-j 合併當前版本和指定版本

使用下面的命令會檢出剛才生成的模塊,並在當前目錄下生成與文件倉庫中完全一樣的目錄結構 : 
linux-tl0r:/work/tmp # cvs checkout cvstest/c
cvs checkout: Updating cvstest/c
cvs checkout: Updating cvstest/c/cvstest
cvs checkout: Updating cvstest/c/cvstest/c
linux-tl0r:/work/tmp # ls
cvstest <成功 check out module>

在當前路徑下生成的這個目錄就被稱為工作目錄,對源文件的所有修改都應該在這個目錄下完成,而絕對不允許去改動在文件倉庫中$CVSROOT 目錄下的文件. 
- 刪除、增加、重命名文件和目錄 
cvs add [-k kflags][-m message] files... 
-k 指定以後該文件的預設Check out目錄
-m 對文件的描述

上述命令會加入一個新的文件到文件倉庫裡,但直到使用了提交命令它才會真正更新文件倉庫. 
cvs remove [options] files 
上述命令會從文件倉庫中刪除文件,但也要到提交之後才有作用. 
例1 : 增加文件 
john@linux-tl0r:/work/temp> cvs checkout test 
cvs checkout: Updating test
cvs checkout: Updating test/c
cvs checkout: Updating test/c/tmp
...(中間省略)...
john@linux-tl0r:/work/temp> ls
test <成功check out>
john@linux-tl0r:/work/temp> cd test/c/
john@linux-tl0r:/work/temp/test/c> ls
john@linux-tl0r:/work/temp/test/c> touch test.c <建立新檔案 test.c>
john@linux-tl0r:/work/temp/test/c> cvs add test.c <將新檔案加入 cvs, 但要 commit 才生效>
cvs add: scheduling file `test.c' for addition
cvs add: use `cvs commit' to add this file permanently
john@linux-tl0r:/work/temp/test/c> cvs commit -m "Add test.c" <提交 cvs>
cvs commit: Examining .
...(中間省略)...
/home/cvsroot/test/c/test.c,v <-- test.c
initial revision: 1.1

例2 : 刪除文件 
john@linux-tl0r:/work/temp/test/c> rm test.c <刪除文件>
john@linux-tl0r:/work/temp/test/c> cvs remove test.c <使用–f 選項能兩步合做一步 : cvs remove –f test.c>
cvs remove: scheduling `test.c' for removal
cvs remove: use `cvs commit' to remove this file permanently
john@linux-tl0r:/work/temp/test/c> cvs add test.c <如果在提交之前想恢復剛才刪除的文件, 可以這麼做...>
john@linux-tl0r:/work/temp/test/c> ls -l
total 8
drwxr-xr-x 2 john users 4096 Dec 10 14:54 CVS
-rw-r--r-- 1 john users 0 Dec 10 14:54 test.c <剛剛被刪除文件, 又回來啦>
drwxr-xr-x 4 john users 4096 Dec 10 14:45 tmp

對於重命名的文件,可以先刪除再添加. 
對於目錄的修改(重命名),可能需要修改cvs 管理文件,一般應該遵循以下步驟: 
1) 確認所有有關的修改都已經提交; 
2) 進入文件倉庫中要修改的模塊目錄,對相應的目錄進行修改(重命名或刪除) 
- 提交源文件 
cvs commit [-Rl][-m mesg] files 
-R 連子目錄一起提交
-l 只提交本地目錄(不提交子目錄)
-m 註釋信息

在檢出源文件之後,在工作目錄中對源文件進行的所有修改都必須在提交之後才能對文件倉庫中的源文件起作用,並且新的文件才能夠被分配一個新的版本號. 
- 釋放工作目錄 
cvs release –d SOURCE 
這個命令會刪除工作目錄cvstest/c (建議在提交了修改的模塊後執行這一步), 它比使用rm –rf cvstest 正規!! 

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

- 衝突解決 
在有多個用戶對同一個文件進行修改時,如果修改了其中的相同部分,而修改後的內容如果有不同的話,出現衝突是不可避免的。 如果在CVS 文件倉庫中有一個文件test.c ,它的版本是1.4, 用戶A 先檢出該文件進行修改,而稍後有用戶B 檢出該文件進行修改,並提前提交成1.5, 而在用戶A再提交時就會出現衝突(如果文件內容不同的話),這時CVS會提示需要手工解決 : 
- 文件倉庫中的版本1.4 :
  1. #include stdio.h  
  2. main(){  
  3.     int i;  
  4.     for(i = 0; i < 100; i++)  
  5.     printf(“Count: %d”, i);  
  6. }  

- 用戶B 1.5 :
  1. #include stdio.h  
  2. main() {  
  3.     int i;  
  4.     for(i = 0; i < 10; i++)  
  5.     printf(“Count: %d”, i);  
  6.     printf(“Over”);  
  7. }  

- 用戶A 修改後 :
  1. #include stdio.h  
  2. main(){  
  3.     int i;  
  4.     for(i = 0; i < 50; i++)  
  5.         printf(“Count: %d”, i);  
  6.     return;  
  7. }  

提交時會提示有衝突,需要手工編輯,這時運行了$cvs update 之後再編輯test.c, 會看到 : 
- 衝突文件 :
  1. #include stdio.h  
  2. main() {  
  3.      int i;  
  4. <<<<<<< test.c  
  5.      for(i = 0; i < 50; i++)  
  6. =======  
  7.      for(i = 0; i < 10; i++)  
  8. >>>>>>> 1.5  
  9.           printf("Count: %d", i);  
  10. <<<<<<< test.c  
  11.     return;  
  12. =======  
  13.     printf("Over  
  14. ");  
  15. >>>>>>> 1.5  
  16. }  

- 文件版本管理 
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 指定版本號

使用上面的命令可以參看指定文件(檢出之後)的所有修改信息 
範例 : 檢驗 test/test.c 的修改訊息 
john@linux-tl0r:/work/temp/test/c> cvs annotate test.c

Annotations for test.c
***************
1.2 (john 10-Dec-10): #include
1.2 (john 10-Dec-10):
1.2 (john 10-Dec-10): void main(){
1.2 (john 10-Dec-10): for(int i=0; i<20; i++)
1.2 (john 10-Dec-10): printf("Count %d", i);
1.3 (john 10-Dec-10): printf("End of app.\n");
1.2 (john 10-Dec-10): }

使用下面的命令可以生成相對於一個指定主版本的分支版本 
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 顯示子目錄信息

範例執行結果如下 : 
john@linux-tl0r:/work/temp/test/c> cvs status test.c
===================================================================
File: test.c Status: Up-to-date

Working revision: 1.3
Repository revision: 1.3 /home/cvsroot/test/c/test.c,v
Commit Identifier: 782c4d01d3904567
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)

在遠程機器上使用CVS : 

補充說明 : 
* 架設 CVS 伺服器

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...