決定主 repository 將要?jiǎng)?chuàng)建和重置的 cvs 根目錄。比如 /usr/local/cvs (根):
# mkdir -p /usr/local/cvs
# setenv CVSROOT /usr/local/cvs # 設(shè)置 CVSROOT 環(huán)境變量(本地)
# cvs init # 創(chuàng)建所有初始化 CVS 配置文件
# cd /root
# cvs checkout CVSROOT # 簽出配置文件來(lái)修改他們
# cd CVSROOT
edit config ( fine as it is)
# cvs commit config
cat >> writers # 創(chuàng)建 writers 文件 (也可為 readers)colin
^D # 使用 [Control][D] 退出編輯
# cvs add writers # 添加文件 writers 進(jìn) repository
# cvs edit checkoutlist
# cat >> checkoutlist
writers
^D # 使用 [Control][D] 退出編輯
# cvs commit # 提交所有配置更改
添加一個(gè) readers 文件,如果你要區(qū)分讀寫權(quán)限的話。注意: 不要在主 cvs 中直接編輯文件,而應(yīng)該簽出要編輯的文件,修改完成后再簽入。我們所做的文件 writers 用來(lái)定義可寫權(quán)限。
下面有三種流行的方式去訪問(wèn) CVS。前兩個(gè)不需要任何進(jìn)一步的配置。看 CVSROOT 部分的實(shí)例了解如何使用它們:
直接本的訪問(wèn)文件系統(tǒng)。用戶需要有足夠的權(quán)限來(lái)直接訪問(wèn) CVS,除了要登錄到操作系統(tǒng),沒(méi)有進(jìn)一步的驗(yàn)證。然而這僅對(duì)本地 repository 才有用。
使用 ext 協(xié)議通過(guò) ssh 來(lái)遠(yuǎn)程訪問(wèn)。任何有 ssh shell 賬戶和在 CVS 服務(wù)器上可讀寫權(quán)限的都可直接使用 ext 協(xié)議通過(guò) ssh 來(lái)訪問(wèn) CVS,而不需要任何額外的隧道。沒(méi)有服務(wù)器來(lái)處理運(yùn)行在 CVS 上的驗(yàn)證工作。ssh 登錄會(huì)去驗(yàn)證。
用 pserver 來(lái)遠(yuǎn)程訪問(wèn)。這是對(duì)于有較大用戶量的首選方法,用戶由 CVS 的 pserver 通過(guò)一個(gè)專門的密碼數(shù)據(jù)庫(kù)來(lái)驗(yàn)證,因此不需要本地用戶帳戶。這種設(shè)置在下面會(huì)有說(shuō)明。
如果不需要網(wǎng)絡(luò)訪問(wèn),CVS 可以運(yùn)行于本地。對(duì)于遠(yuǎn)程訪問(wèn),在 /etc/inetd.conf (Suse 為 /etc/xinetd.d/cvs)中配置如下行,可讓守護(hù)進(jìn)程 inetd 啟動(dòng) pserver:
cvspserver stream tcp nowait cvs /usr/bin/cvs cvs \
--allow-root=/usr/local/cvs pserver
這是個(gè)用來(lái)阻斷從 internet 訪問(wèn) cvs 端口的好方法,可使用 ssh 隧道來(lái)遠(yuǎn)程的訪問(wèn) repository。
CVS 用戶可能不是操作系統(tǒng)的一部分(即不是本地用戶)。這其實(shí)可從安全的角度去看。簡(jiǎn)單的添加一個(gè)叫 passwd (in the CVSROOT directory) 的文件,其包含 crypt 格式的用戶登錄名和密碼。這也可以使用 apache 的 htpasswd 工具來(lái)完成。
_注意:_這個(gè) passwd 文件僅僅是文件,可以在 CVSROOT 中直接編輯。它不能被簽出。更多信息請(qǐng)用 htpasswd --help
# htpasswd -cb passwd user1 password1 # -c 創(chuàng)建文件
# htpasswd -b passwd user2 password2
現(xiàn)在添加 :cvs
到每行的結(jié)尾處,用來(lái)告訴 cvs 服務(wù)器更改用戶到 cvs (或任何你正在運(yùn)行的 cvs 服務(wù)器下)。它看起來(lái)像這樣:
# cat passwd
user1:xsFjhU22u8Fuo:cvs
user2:vnefJOsnnvToM:cvs
測(cè)試作為一般用戶登錄(比如我)
# 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:
這是個(gè)環(huán)境變量用來(lái)指定 repository 的位置。對(duì)于本地使用,該變量只需設(shè)置成 repository 的目錄。對(duì)于通過(guò)網(wǎng)絡(luò)使用,傳輸協(xié)議必須指定。使用 setenv CVSROOT string
(csh, tcsh shell) 或者 export CVSROOT=string
( sh, bash shell) 設(shè)置 CVSROOT 環(huán)境變量。
# 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 # 通過(guò) SSH 直接訪問(wèn)
# setenv CVS_RSH ssh # ext 協(xié)議訪問(wèn)
# setenv CVSROOT :pserver:user@cvsserver.254:/usr/local/cvs # 通過(guò) pserver 網(wǎng)絡(luò)訪問(wèn)
一旦登錄成功就可導(dǎo)入一個(gè)新項(xiàng)目進(jìn) repository:cd 進(jìn)入你的項(xiàng)目根目錄
cvs import <module name> <vendor tag> <initial tag>
cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs import MyProject MyCompany START
在 repository 中有個(gè)名叫 MyProject 新項(xiàng)目(之后用來(lái)簽出)。CVS 會(huì)導(dǎo)入當(dāng)前目錄的內(nèi)容進(jìn)新項(xiàng)目。
簽出:
# 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
我們需要兩個(gè) shell 來(lái)做這個(gè)。在第一個(gè) shell 中,我們連接到 cvs 服務(wù)器并對(duì) cvs 連接進(jìn)行端口轉(zhuǎn)發(fā)(port-forward)。在第二個(gè) shell 中,我們就像在本地一樣使用 cvs。
在 shell 1:
# ssh -L2401:localhost:2401 colin@cvs_server # 直接連接到 cvs 服務(wù)器?;颍?# ssh -L2401:cvs_server:2401 colin@gateway # 使用一個(gè)網(wǎng)關(guān)間接連接到 cvs 服務(wù)器
在 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
該 import 命令用來(lái)添加整個(gè)目錄,它必須運(yùn)行于要導(dǎo)入的目錄中。比如,目錄 /devel/ 包含的所有文件和子目錄要導(dǎo)入。該目錄名在 CVS 中(模塊)將會(huì)稱為 "myapp"。
# cvs import [options] directory-name vendor-tag release-tag
# cd /devel # 必須在該目錄中來(lái)導(dǎo)入
# cvs import myapp Company R1_0 # 修訂(release)標(biāo)簽可以為任何單個(gè)單詞
在添加了一個(gè)新目錄 "/devel/tools/" 后,也可這么導(dǎo)入。
# cd /devel/tools
# cvs import myapp/tools Company R1_0
# cvs co myapp/tools # 僅會(huì)簽出 tools 目錄
# cvs co -r R1_1 myapp # 簽出修訂版本為 R1_1 的 myapp (sticky)
# cvs -q -d update -P # 典型的 CVS 更新
# cvs update -A # 重置所有 sticky 標(biāo)簽(或日期、選項(xiàng))
# cvs add newfile # 添加一個(gè)新文件
# cvs add -kb newfile # 添加一個(gè)二進(jìn)制文件
# cvs commit file1 file2 # 僅提交這兩個(gè)文件
# cvs commit -m "message" # 提交所有更改并為這個(gè)更改添加日志消息
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
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
更多建議: