## 服務器設置
### CVS 環境初始化
決定主 repository 將要創建和重置的 cvs 根目錄。比如 /usr/local/cvs (根):
#?mkdir?-p?/usr/local/cvs
#?setenv?CVSROOT?/usr/local/cvs??????#?設置?CVSROOT?環境變量(本地)
#?cvs?init???????????????????????????#?創建所有初始化?CVS?配置文件
#?cd?/root
#?cvs?checkout?CVSROOT???????????????#?簽出配置文件來修改他們
#?cd?CVSROOT
edit?config?(?fine?as?it?is)
#?cvs?commit?config
cat?>>?writers???????????????????????#?創建?writers?文件?(也可為?readers)colin
^D???????????????????????????????????#?使用?[Control][D]?退出編輯
#?cvs?add?writers????????????????????#?添加文件?writers?進?repository
#?cvs?edit?checkoutlist
#?cat?>>?checkoutlist
writers
^D???????????????????????????????????#?使用?[Control][D]?退出編輯
#?cvs?commit?????????????????????????#?提交所有配置更改
添加一個?**readers**?文件,如果你要區分讀寫權限的話。_注意:_?不要在主 cvs 中直接編輯文件,而應該簽出要編輯的文件,修改完成后再簽入。我們所做的文件?**writers**?用來定義可寫權限。
下面有三種流行的方式去訪問 CVS。前兩個不需要任何進一步的配置。看?[CVSROOT](http://cb.vu/unixtoolbox_zh_CN.xhtml#cvsroot)?部分的實例了解如何使用它們:
-
直接本的訪問文件系統。用戶需要有足夠的權限來直接訪問 CVS,除了要登錄到操作系統,沒有進一步的驗證。然而這僅對本地 repository 才有用。
-
使用 ext 協議通過 ssh 來遠程訪問。任何有 ssh shell 賬戶和在 CVS 服務器上可讀寫權限的都可直接使用 ext 協議通過 ssh 來訪問 CVS,而不需要任何額外的隧道。沒有服務器來處理運行在 CVS 上的驗證工作。ssh 登錄會去驗證。
-
用 pserver 來遠程訪問。這是對于有較大用戶量的首選方法,用戶由 CVS 的 pserver 通過一個專門的密碼數據庫來驗證,因此不需要本地用戶帳戶。這種設置在下面會有說明。
### 用 inetd 設置網絡
如果不需要網絡訪問,CVS 可以運行于本地。對于遠程訪問,在 /etc/inetd.conf (Suse 為 /etc/xinetd.d/cvs)中配置如下行,可讓守護進程 inetd 啟動 pserver:
cvspserver stream??tcp??nowait??cvs??/usr/bin/cvs cvs?\
--allow-root=/usr/local/cvs?pserver
這是個用來阻斷從 internet 訪問 cvs 端口的好方法,可使用 ssh 隧道來遠程的訪問 repository。
## 單獨認證
CVS 用戶可能不是操作系統的一部分(即不是本地用戶)。這其實可從安全的角度去看。簡單的添加一個叫?**passwd**?(in the CVSROOT directory) 的文件,其包含 crypt 格式的用戶登錄名和密碼。這也可以使用 apache 的 htpasswd 工具來完成。
_注意:_這個 passwd 文件僅僅是文件,可以在 CVSROOT 中直接編輯。它不能被簽出。更多信息請用 htpasswd --help
#?htpasswd?-cb?passwd?user1?password1??#?-c?創建文件
#?htpasswd?-b?passwd?user2?password2
現在添加?`:cvs`?到每行的結尾處,用來告訴 cvs 服務器更改用戶到 cvs (或任何你正在運行的 cvs 服務器下)。它看起來像這樣:
#?cat?passwd
user1:xsFjhU22u8Fuo:cvs
user2:vnefJOsnnvToM:cvs
### 測試它
測試作為一般用戶登錄(比如我)
#?cvs?-d?:pserver:colin@192.168.50.254:/usr/local/cvs?login
Logging?in?to?:pserver:colin@192.168.50.254:2401/usr/local/cvs
CVS?password:
### CVSROOT 變量
這是個環境變量用來指定 repository 的位置。對于本地使用,該變量只需設置成 repository 的目錄。對于通過網絡使用,傳輸協議必須指定。使用?`setenv CVSROOT string`?(csh, tcsh shell) 或者?`export CVSROOT=string`?( sh, bash shell) 設置 CVSROOT 環境變量。
#?setenv?CVSROOT?:pserver:<username>@<host>:/cvsdirectory
For?example:
#?setenv?CVSROOT?/usr/local/cvs???????????????????????????????#?僅限本的使用
#?setenv?CVSROOT?:local:/usr/local/cvs????????????????????????#?同上
#?setenv?CVSROOT?:ext:user@cvsserver:/usr/local/cvs???????????#?通過?SSH?直接訪問
#?setenv?CVS_RSH?ssh??????????????????????????????????????????#?ext?協議訪問
#?setenv?CVSROOT?:pserver:user@cvsserver.254:/usr/local/cvs???#?通過?pserver?網絡訪問
一旦登錄成功就可導入一個新項目進 repository:**cd 進入**你的項目根目錄
cvs?import?<module?name>?<vendor?tag>?<initial?tag>
cvs?-d?:pserver:colin@192.168.50.254:/usr/local/cvs?import?MyProject?MyCompany?START
在 repository 中有個名叫 MyProject 新項目(之后用來簽出)。CVS 會導入當前目錄的內容進新項目。
簽出:
#?cvs?-d?:pserver:colin@192.168.50.254:/usr/local/cvs?checkout?MyProject
或者
#?setenv?CVSROOT?:pserver:colin@192.168.50.254:/usr/local/cvs
#?cvs?checkout?MyProject
### 通過 SSH 隧道訪問 CVS
我們需要兩個 shell 來做這個。在第一個 shell 中,我們連接到 cvs 服務器并對 cvs 連接進行端口轉發(port-forward)。在第二個 shell 中,我們就像在本地一樣使用 cvs。?
在 shell 1:
#?ssh?-L2401:localhost:2401?colin@cvs_server???#?直接連接到?cvs?服務器。或:
#?ssh?-L2401:cvs_server:2401?colin@gateway?????#?使用一個網關間接連接到?cvs?服務器
在 shell 2:
#?setenv?CVSROOT?:pserver:colin@localhost:/usr/local/cvs
#?cvs?login
Logging?in?to?:pserver:colin@localhost:2401/usr/local/cvs
CVS?password:
#?cvs?checkout?MyProject/src
## CVS 命令及其使用
### 導入
該 import 命令用來添加整個目錄,它必須運行于要導入的目錄中。比如,目錄 /devel/ 包含的所有文件和子目錄要導入。該目錄名在 CVS 中(模塊)將會稱為 "myapp"。
#?cvs?import?[options]?directory-name?vendor-tag?release-tag
#?cd?/devel??????????????????????????#?必須在該目錄中來導入
#?cvs?import?myapp?Company?R1_0??????#?修訂(release)標簽可以為任何單個單詞
在添加了一個新目錄 "/devel/tools/" 后,也可這么導入。
#?cd?/devel/tools
#?cvs?import?myapp/tools?Company?R1_0
### 簽出、更新和提交
#?cvs?co?myapp/tools?????????????????#?僅會簽出?tools?目錄
#?cvs?co?-r?R1_1?myapp???????????????#?簽出修訂版本為?R1_1?的?myapp?(sticky)
#?cvs?-q?-d?update?-P????????????????#?典型的?CVS?更新
#?cvs?update?-A??????????????????????#?重置所有?sticky?標簽(或日期、選項)
#?cvs?add?newfile????????????????????#?添加一個新文件
#?cvs?add?-kb?newfile????????????????#?添加一個二進制文件
#?cvs?commit?file1?file2?????????????#?僅提交這兩個文件
#?cvs?commit?-m?"message"????????????#?提交所有更改并為這個更改添加日志消息
### 創建一個 patch
It is best to create and apply a patch from the working development directory related to the project, or from within the source directory.
#?cd?/devel/project
#?diff?-Naur?olddir?newdir?>?patchfile?#?Create?a?patch?from?a?directory?or?a?file
#?diff?-Naur?oldfile?newfile?>?patchfile
### 應用一個 patch
Sometimes it is necessary to strip a directory level from the patch, depending how it was created. In case of difficulties, simply look at the first lines of the patch and try -p0, -p1 or -p2.
#?cd?/devel/project
#?patch?--dry-run?-p0?<?patchfile????#?Test?the?path?without?applying?it
#?patch?-p0?<?patchfile
#?patch?-p1?<?patchfile??????????????#?strip?off?the?1st?level?from?the?path