本文出自:http://www.linuxforum.net 作者: lhl (enthusiast)
假設:
cvsroot user:cvsroot home=/home2/cvsroot/cvsroot
cvs group:cvs
1:安全
#groupadd cvs
#mkdir /home2/cvsroot#注意:/home2/cvsroot為root所有
#useradd -g cvs -G cvs -d /home2/cvsroot/cvsroot cvsroot
/***未經實驗**/
#mv /usr/bin/cvs /usr/bin/cvs.real
#cat > /usr/bin/cvs
#!/bin/sh
umask 2# Or whatever your site standard is.
exec /usr/bin/cvs.real ${1+"$@"}
^D
/*************/
2:多倉庫
注意,我們用cvsroot僅僅是用來管理,所以,不要在它$HOME下面創建任何倉庫
另外,cvsroot用戶的初始環境不應該包含非空的$CVSROOT.
使用cvsroot來進行的任何管理工作都指明CVSROOT是一個好的習慣.
OK,開始給單個項目建倉庫
假設有兩個項目,project1,project2,希望單獨存放,便于管理
#mkdir /home2/cvsroot/pro1
#mkdir /home2/cvsroot/pro2
#chown cvsroot.cvs /home2/cvsroot/pro1
#chown cvsroot.cvs /home2/cvsroot/pro2
#chmod 2775 /home2/cvsroot/pro1
#chmod 2775 /home2/cvsroot/pro2
(更高的安全要求則$chmod 2770 /home2/cvsroot/cvsroot/pro1)
OK,開始建立倉庫
#su - cvsroot
$cvs -d /home2/cvsroot/pro1 init
$cvs -d /home2/cvsroot/pro2 init
$chmod 2775 /home2/cvsroot/pro1
$chmod 2775 /home2/cvsroot/pro2
修改啟動文件
service cvspserver
{
disable = no
flags= REUSE
socket_type= stream
wait= no
user= root
bind= 192.168.0.1
only_from= 192.168.0.0/24
server= /usr/bin/cvs
server_args= -f --allow-root=/home2/cvsroot/pro1 --allow-root=/home2/cvsroot/pro2 pserver
log_on_failure += USERID
}
/********技巧*************/
由于xinetd的server_args長度限制,當你想運行很多的單個倉庫的時候,可以這么做,
#vi /etc/xinetd.d/cvspserver
service cvspserver
{
disable= no
flags= REUSE
socket_type= stream
wait= no
user= root
bind= 192.168.0.1
only_from= 192.168.0.1.0/24
server= /home2/cvsroot/cvs.run
log_on_failure += USERID
}
:wq
然后寫腳本/home2/cvsroot/cvs.run
#vi /home2/cvsroot/cvs.run
#!/bin/bash
/usr/bin/cvs -f \
--allow-root=/home2/cvsroot/pro1 \
--allow-root=/home2/cvsroot/pro2 \
--allow-root=/home2/cvsroot/pro3 \
--allow-root=/home2/cvsroot/pro4 \
--allow-root=/home2/cvsroot/pro5 \
--allow-root=/home2/cvsroot/pro6 \
pserver
:wq
#chmod +x /home2/cvsroot/cvs.run
#service xinetd restart
OK!
/*************************/
修改不同倉庫的策略
#su - cvsroot
$export CVSROOT=/home2/cvsroot/pro1
$cvs co CVSROOT
$cd CVSROOT
$vi config
# Set this to "no" if pserver shouldn@#t check system users/passwords
SystemAuth=no
# Put CVS lock files in this directory rather than directly in the repository.
LockDir=/var/cache/cvs/pro1
# Set `TopLevelAdmin@# to `yes@# to create a CVS directory at the top
# level of the new working directory when using the `cvs checkout@#
# command.
#TopLevelAdmin=no
# Set `LogHistory@# to `all@# or `TOFEWGCMAR@# to log all transactions to the
# history file, or a subset as needed (ie `TMAR@# logs all write operations)
LogHistory=TOFEWGCMAR
:wq
$vi loginfo
ALL (echo %{sVv}; cat) | /usr/local/viewcvs-0.9.2/loginfo-handler#SQL checkin
:wq
$cvs commit -m "auth change,log change"
OK,既然不使用系統用戶驗證,那么我們來創建用戶
/************/
不使用系統帳號的原因是充分保證安全,避免系統帳號直接刪除倉庫里的文件.
雖然麻煩,但是很有必要,因為無法保證每一個程序員都對cvs操作很有經驗.
在這種情況下,為每一個工程各建一個等效系統用戶,此用戶應該是cvs組的成員.
不必有shell.
(也可以為所有的項目建一個等效用戶,私有的cvs Server完全可以這么做,甚至可以
直接使用cvsroot,呵呵,就是比較危險而已)
#adduser -g cvs -G cvs -s /bin/false -d /home2/cvsroot/pro1 -M cvspro1
/************/
創建一個LockDir(選擇/var/cache是因為某些系統放在/var/lock下面有問題)
#mkdir /var/cache/cvs
#chown cvsroot.cvs /var/cache/cvs
#chmod 2775 /var/cache/cvs
#mkdir /var/cache/cvs/pro1
#chown cvspro1.cvs /var/cache/cvs/pro1
#chmod 2775 /var/cache/cvs/pro1
創建用戶
先清除環境
$export CVSROOT=
$cd ~cvsroot
$rm -rf CVSROOT
直接切換到pro1的倉庫下
$cd /home2/cvsroot/pro1
$cd CVSROOT
創建用戶hleil
$htpasswd -c passwd hleil
修改passwd成cvs的格式
$vi passwd
hleil:svcsdasdcvjn:cvspro1
:wq
加入writers組
$echo hleil >>writers
/*****這里有一個問題**********/
如果用戶hleil需要writers權限,那么,他絕對不可以出現在readers組中.
writers,readers,passwd的文件尾空行是必要的.
等效系統帳號如果不存在,將導致access failed.
cvs帳號盡量沒有對應的系統帳號,如果有,確保它們的passwd不同.
/******************************/
OK了!
項目pro2同理.
3:夠建模塊化的工程
關于模塊化,大家掛在口邊也不是一天兩天了,這里指的是項目的模塊化,不是指具體的程序.
正常的項目開始具體實施之前,必定做好了系統分析和結構設計,當然,像打印"Hello World!"
這樣的"項目"或許不用進行系統分析吧:P,所以也不用麻煩我們辛苦構建的cvs.
軟件設計完成之后,各個模塊應該也就出來了,在實施之前,我們需要考慮用cvs貫徹設計結果.
cvs的模塊不必細化到瘋狂的程度,大致按照功能劃分并且兼顧工作組就可以了.同一模塊必需
僅有單一工作組負責.
確定模塊之后,我們來建立模塊.
#su - hleil
$export CVSROOT=:pserver:hleil@192.168.0.1:/home2/cvsroot/pro1
$cvs login
$cvs co CVSROOT
假設有這樣的目錄結構,
pro01
libs
libs/01
libs/02
每個目錄下面都有一個初始化文件init(方便import)
我們可以這樣定義modules,
$vi CVSROOT/modules
pro01pro01 & libs
libs-01-d 01libs/01
libs-02 -d 02libs/02
libs-a libs-01 libs-02
:wq
$cvs commit -m "init modules"
倒入目錄結構,
$cvs import -m "init checkin" pro01 init start
現在,你的三個小組可以分別工作于pro01,libs-01,libs-02,全部程序只要co pro01就行了.
簡單吧:P
4:克隆
構建模塊
$export CVSROOT=remote
$cvs login
$cvs co CVSROOT/modules
$cvs logout
$mv CVSROOT/modules .
$rm -rf CVSROOT
$export CVSROOT=local
$cvs login
$cvs co CVSROOT/modules
$cp modules CVSROOT/modules
$cvs commit -m "clone init modules"
研究目錄結構
所有的 -a 定義的模塊不需要checkout
$sed "/#/d" modules > modules.tmp
$sed "/^$/d" modules.tmp > modules.tmp2
$sed s/" "*/" "/g modules.tmp2 > modules.tmp
$cat modules.tmp|sed /-a/d >mymodules
仔細研究目錄結構,以便co不含有垃圾的代碼
$cp mymodules co-list
編輯co-list,不需要的注釋,OK
$sed "/#/d" co-list > co-list.tmp
$cut -d " " -f 1 co-list.tmp >co-list
OK,此時的co-list就是我們所需要得所有模塊
$export CVSROOT=remote
$cvs login
$for mm in $(cat co-list)
do
cvs co $mm
done
$cvs logout
$export CVSROOT=local
$cvs login
作合適的目錄調整
如果modules 里面有
xxx yyy
那么,co xxx將產生xxx目錄,實際應該是yyy
保留co-list.tmp以便于查證
比如:
gobj-lib -d gobj libs/gobj
co gobj 則將在本地產生(- d) gobj的目錄,實際倉庫中的位置是libs/gobj
可以根據co-list.tmp的內容編輯一個腳本,
$cvs import -m "cvs checkin init" modulesname init start
OK!
文章來源于領測軟件測試網 http://www.kjueaiud.com/