CVS使用經驗談
來源:龔天乙 (2005-08-24 17:43:18)
CVS 是 Concurrent Version System(並行版本系統)的縮寫,用於版本管理。在多人團隊開發中的作用更加明顯。CVS 的基本工作思路是這樣的:在一台伺服器上建立一個倉庫,倉庫裡可以存放許多不同項目的來源程式。由倉庫管理員統一管理這些來源程式。這樣,就好象只有一個人在修改檔案一樣。避免了衝突。每個使用者在使用倉庫之前,首先要把倉庫裡的專案檔下載到本地。使用者做的任何修改首先都是在本地進行,然後用 cvs 命令進行提交,由 cvs 倉庫管理員統一 修改。這樣就可以做到追蹤檔案變化,衝突控制等等。
由於CVS是建立在在原先 Unix 體系裡很成熟的 SCCS 和 RCS 的基礎上,所以CVS多是Linux(UNIX)系統中所使用,本文中伺服器端設定也是以Linux為例。
一、CVS伺服器的安裝
首先確認系統中是否安裝CVS服務: [root@localhost /]# rpm -qa|grep cvscvs-1.11.2-cvshome.7x.1 如果命令輸出類似於上面的輸出則說明系統已經安裝有cvs,否則就需要從安裝光碟片中安裝cvs的rpm包,或者到http://www.cvshome.org下載。
1、建立 CVSROOT
目錄,因為這裡涉及到使用者對CVSROOT裡的檔案讀寫的許可權問題,所以比較簡單的方法是建立一個組,然後再建立一個屬於該組的帳戶,而且以後有讀寫權限的使用者都要屬於該組。假設我們建一個組叫cvs,使用者名稱是cvsroot。建組和使用者的命令如下
#groupadd cvs#adduser cvsroot
產生的使用者宿主目錄在/home/cvsroot(根據自己的系統調整)
2、用cvsroot 使用者登陸,修改 /home/cvsroot (CVSROOT)的許可權,賦與同組人有讀寫的許可權:
$chmod 771 . (或者770應該也可以)
注意:這一部分工作是按照文檔說明做的,是否一定需要這樣沒有實驗,我會在做實驗後在以後版本的教程說得仔細一點。如果您有這方面的經驗請提供給我,謝謝。
3、建立CVS倉庫,(仍然是 cvsroot 使用者),用下面命令:
$cvs -d /home/cvsroot init
4、以root身份登陸,修改 /etc/inetd.conf(使用 xinetd 的系統沒有此檔案)和 /etc/services
如果用的是 inetd 的系統,在 /etc/inetd.conf 裡加入: cvsserver stream tcp nowait root /usr/bin/cvs cvs -f --allow-root=/home/cvsroot pserver
說明:上面的行是單獨一整行,/usr/bin/cvs 應該是你的cvs版本的命令路徑,請根據自己的系統調整./home/cvsroot是你建立的CVSROOT的路徑,也請根據上面建立目錄的部分的內容做調整。
如果是使用 xinetd 的系統,需要在 /etc/xinetd.d/ 目錄下建立檔案 cvspserver(此名字可以自己定義),內容如下:
# default: on # description: The cvs server sessions;
service cvsserver { socket_type = stream wait = no user = root server = /usr/bin/cvs server_args = -f --allow-root=/cvsroot pserver log_on_failure += USERID only_from = 192.168.0.0/24 }
其中only_from是用來限制訪問的,可以根據實際情況不要或者修改。修改該檔案許可權:
# chmod 644 cvspserver
在/etc/services裡加入:
cvsserver 2401/tcp
說明:cvsserver 是任意的名稱,但是不能和已有的服務重名,也要和上面修改 /etc/inetd.conf 那行的第一項一致。
5、添加可以使用 CVS 服務的使用者到 cvs 組:
以 root 身份修改 /etc/group,把需要使用 CVS 的使用者名稱加到 cvs 組裡,比如我想讓使用者 laser 和gumpwu 能夠使用 CVS 服務,那麼修改以後的 /etc/group 應該有下面這樣一行:
cvs:x:105:laser,gumpwu
在你的系統上GID可能不是105,沒有關係。主要是要把laser和gumpwu用逗號分隔開寫在最後一個冒號後面。當然,象RedHat等分發版有類似linuxconf這樣的工具的話,用工具做這件事會更簡單些。
6、重起inetd使修改生效:
#killall -HUP inetd
如果使用的是 xinetd 的系統:
# /etc/rc.d/init.d/xined restart
然後察看cvs伺服器是否已經運行:[root@localhost /]# netstat -lnp|grep 2401 tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN 1041/xinetd則說明cvs伺服器已經運行。
二、管理CVS伺服器
伺服器可以用了,現在大家最關心的就是如何管理伺服器,比如,我想讓一些人有讀和/或寫 CVS 倉庫的許可權,但是不想給它系統許可權怎麼辦呢?
不難,在 cvs 管理使用者(在我這裡是 cvsroot 使用者)的家目錄裡有一個 CVSROOT 目錄,這個目錄裡有三個設定檔,passwd, readers, writers,我們可以通過設定這三個檔案來配置 CVS 伺服器,下面分別介紹這幾個檔案的作用:
passwd:cvs 使用者的使用者列表檔案,它的格式很象 shadow 檔案:
{cvs 使用者名稱}:[加密的口令]:[等效系統使用者名稱]
如果你希望一個使用者只是 cvs 使用者,而不是系統使用者,那麼你就要設定這個檔案,剛剛安裝完之後這個檔案可能不存在,你需要以 cvs 管理使用者手工建立,當然要按照上面格式,第二個欄位是該使用者的加密口令,就是用 crypt (3)加密的,你可以自己寫一個程式來做加密,也可以用我介紹的偷懶的方法:先建立一個系統使用者,名字和 cvs 使用者一樣,口令就是準備給它的 cvs 使用者口令,建立完之後從 /etc/shadow 把該使用者第二個欄位拷貝過來,然後再把這個使用者刪除。這個方法對付數量少的使用者比較方便,人一多就不合適了,而且還有衝突條件(race condition)的安全隱患,還要 root 許可權,實在不怎麼樣。不過權益之計而已。寫一個小程式並不難,可以到 linuxforum 的編程版搜尋一下,有個朋友已經寫了一個貼在上面了。
第三個欄位就是等效系統使用者名稱,實際上就是賦與一個 cvs 使用者一個等效的系統使用者的許可權,看下面的例子你就明白它的功能了。
readers:有 cvs 讀許可權的使用者列表檔案。就是一個一維列表。在這個檔案中的使用者對 cvs只有讀許可權。
writers:有 cvs 寫入權限的使用者的列表檔案。和 readers 一樣,是一個一維列表。在這個檔案中的使用者對 cvs 有寫入權限。
上面三個檔案在預設安裝的時候可能都不存在,需要我們自己建立,好吧,現在還是讓我們用一個例子來教學吧。假設我們有下面幾個使用者需要使用 cvs:
laser, gumpwu, henry, betty, anonymous。
其中 laser 和 gumpwu 是系統使用者,而 henry, betty, anonymous 我們都不想給系統使用者權限,並且 betty 和 anonymous 都是唯讀使用者,而且 anonymous 更是連口令都沒有。那麼好,我們先做一些準備工作,先建立一個 cvspub 使用者,這個使用者的責任是代表所有非系統使用者的 cvs 使用者讀寫 cvs 倉庫。
#adduser ...
然後編輯 /etc/group,令 cvspub 使用者在 cvs 組裡,同時把其它有系統使用者權限的使用者加到 cvs 組裡。(見上文)
然後編輯 cvs 管理員家目錄裡 CVSROOT/passwd 檔案,加入下面幾行:
laser:$xxefajfka;faffa33:cvspub gumpwu:$ajfaal;323r0ofeeanv:cvspub henry:$fajkdpaieje:cvspub betty:fjkal;ffjieinfn/:cvspub anonymous::cvspub
注意:上面的第二個欄位(分隔字元為 :)是密文口令,你要用程式或者用我的土辦法產生。
編輯 readers 檔案,加入下面幾行:
anonymous betty
編輯 writers 檔案,加入下面幾行:
laser gumpwu henry
注意:writers中的使用者不能在readers中,要不然不能上傳更新檔案。
對於使用CVS的使用者要修改它的環境變數,例如laser使用者的環境變數,開啟/home/laser(laser的宿主目錄)下的.bash_profile檔案,加入
CVSROOT=/home/cvsroot export CVSROOT
用laser登陸就可以建立CVS項目,如果要root使用,可以修改/etc/profile檔案。
現在我們各項都設定好了,那麼怎麼用呢,我在這裡寫一個最簡單的(估計也是最常用的)命令介紹:
首先,建立一個新的CVS項目,一般我們都已經有一些專案檔了,這樣我們可以用下面步驟產生一個新的CVS項目:
進入到你的已有項目的目錄,比如叫 cvstest:
$cd cvstest 運行命令: $cvs import -m "this is a cvstest project" cvstest v_0_0_1 start
說明:import 是cvs的命令之一,表示向cvs倉庫輸入專案檔。 -m參數後面的字串是描述文本,隨便寫些有意義的東西,如果不加 -m 參數,那麼cvs會自動運行一個編輯器(一般是vi,但是可以通過修改環境變數EDITOR來改成你喜歡用的編輯器。)讓你輸入資訊,cvstest 是項目名稱(實際上是倉庫名,在CVS伺服器上會儲存在以這個名字命名的倉庫裡。)v_0_0_1是這個分支的總標記。沒啥用(或曰不常用。)start 是每次 import 標識檔案的輸入層次的標記,沒啥用。這樣我們就建立了一個CVS倉庫了。
建立CVS倉庫的檔案夾應該是“乾淨”的檔案夾,即只包括源碼檔案和描述的檔案加,而不應該包括編譯過的檔案代碼等!
三、使用CVS
winCVS是一個很好的CVS用戶端軟體,在http://cnpack.cosoft.org.cn/down/wincvsdailyguide.pdf可以下載到這個軟體的使用手冊。這裡不在贅述了。
四、用CVS管理項目
本人正在一加公司從事該公司ERP項目的開發,在沒有使用CVS的時候,多次出現了由於不同的開發人員修改同一程式,而導致程式錯誤,解決版本控制問題迫在眉睫。
由於這個項目採用Linux平台下JAVA開發,使用的開發工具Jbulider是支援CVS進行專案管理的,作為主程式員,我決定採用CVS進資料列版本設定,首先參照上文在Linux伺服器上建立了CVS服務,然後我把我本地的工程檔案傳至伺服器。
例如:我的工程檔案在F:\ERP下,我把ERP下的erp.jpx檔案、defaultroot檔案夾和src檔案夾上傳至伺服器/usr/local/erp下,然後登陸Linux伺服器,登陸的使用者是CVS的使用者,其環境變數要正確(我的使用者名稱為admin)
#cd /usr/local/erp #cvs import -m "this is a ERP project" erp v_0_0_1 start
這樣名為erp的CVS倉庫就建立了。
之後開發小組的成員可以用winCVS把該項目下載到本地:
開啟winCVS
點擊工具列Create -> Create a new repository... 快顯視窗 在Grenral中 Enter the CVSROOT填寫admin@192.168.1.9:/home/cvsroot 其中admin是cvs的使用者,在本例中admin也是linux的系統使用者,192.168.1.9是伺服器的地址,/home/cvsroot是CVS的主目錄,參考上文。 Authentication中選擇"passwd file on the cvs server" Use version中選擇cvs 1.10 (Standard)
其它項預設即可。
確認後,點工具列Admin --> Login... 會提示輸入密碼,輸入密碼後,看看winCvs的狀態列。如果提示
*****CVS exited normally with code 0*****
表示登入正常。
點擊工具列Create --> Checkout module...彈出對話方塊,其中的Checkout settings項中 Enter the module name and path on the server 填寫erp,即我們建立的名為erp的CVS倉庫 Local folder to checkout to 選擇要下載到本地的目錄,我選了F:\myerp
其它項目可以預設,確定後就可以下載到本地了,在F:\myerp\下會有一個erp檔案夾,其檔案結構和F:\erp下的檔案結構是一樣的。
用Jbulider開啟F:\myerp\erp\下的erp.jpx檔案,這個工程檔案就可以使用了。
在Jbuilder的工具列Team --> Select Project VCS 彈出對話方塊,選擇CVS
對於你要進行修改的檔案,在Project View中點中該檔案,然後點右鍵,探出捷徑功能表,選擇CVS --> CVS Edit "xxxx.java(檔案名稱)"
第一次使用可能會提示CVS伺服器的密碼。
在修改之前還要選擇CVS --> Update "xxxx.java(檔案名稱)"
修改之後選擇CVS --> Commit "xxxx.java(檔案名稱)"
這樣,修改的檔案就儲存到CVS伺服器了,Update的目的是下載、比較檔案。每次在修改之前都Update,保持最新版本。
CVS在專案管理使用中確實起到了良好的效果,仔細研究CVS的命令,可以更好的發揮CVS在版本控制上的能力。
我的QQ是20896,歡迎大家來交流,也可以到我的論壇上討論 http://www.laoer.com
參考資料:《CVS 簡單教程》 作者:何偉平 《CVS伺服器快速指南》 作者:何偉平
(http://www.fanqiang.com)