老馬

http://www.linuxfans.org/nuke/modules.php?name=News&file=article&op=view&sid=2519

 1、 首先創(chuàng)建用于CVS的組和用戶:

    • #groupadd cvs
    • #useradd cvsroot -g cvs
    • #passwd cvsroot

OK,用戶已經(jīng)建立好了,cvsroot就是我們做CVS操作使用的。

安裝cvs,很簡單了,就是./configure; make ;make install

2. 修改配置文件:

 #more /etc/services | grep cvspserver

看看是否有:

cvspserver 2401/tcp #CVS client/server operations

cvspserver 2401/udp #CVS client/server operations

這2行。系統(tǒng)自帶了CVS時,這2行也已經(jīng)有了,只需要確認(rèn)一下。如果沒有,請自己加上去。然后必須創(chuàng)建啟動腳本: #vi /etc/xinet.d/cvspserver 內(nèi)容如下:

service cvspserver
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/local/bin/cvs
server_args = -f --allow-root= /home/cvsroot/cvsdata pserver
log_on_success += USERID
log_on_failure += USERID
}

其中server指定CVS可執(zhí)行文件路徑,默認(rèn)安裝就是/usr/local/bin/cvs。server_args指定源代碼庫路徑及認(rèn)證方式等,例子中把源代碼存放在cvsroot的主目錄中,也可以另外指定路徑,但必須注意權(quán)限設(shè)置,pserver是密碼認(rèn)證方式,這種方式的安全性要差一些,但操作起來比較簡單。請注意每行等號左右都有一個空格,否則無法啟動服務(wù)。

3. 初始化CVS

 切換到cvsroot用戶,然后進(jìn)行初始化:

#cvs -d /home/cvsroot/cvsdata init

 這個路徑應(yīng)該與cvspserver文件中指定的路徑相同,初始化后會在此路徑下面創(chuàng)建CVSROOT目錄,存放用于CVS管理的一些文件。

此時重新啟動xinetd服務(wù),CVS服務(wù)器應(yīng)該能夠啟動了。#service xinetd restart 當(dāng)然,重新啟動計算機也可以。

確認(rèn)是否啟動: #netstat -l | grep cvspserver 如果能看到:

tcp 0 0 *:cvspserver *:* LISTEN 說明已經(jīng)正常啟動,沒有的話請重新檢查配置過程是否有錯誤或者遺漏。最后還必須檢查防火墻的設(shè)置,把2401端口打開。

4. 用戶管理

CVS默認(rèn)使用系統(tǒng)用戶登錄,為了系統(tǒng)安全性的考慮也可以使用獨立的用戶管理。CVS用戶名和密碼保存在CVSROOT目錄下的passwd文件中,格式為: 用戶名:密碼:系統(tǒng)用戶 也就是說,它把CVS用戶映射到系統(tǒng)用戶,這樣我們就可以通過系統(tǒng)用戶的權(quán)限設(shè)置來分配給用戶不同的權(quán)限,而不需要讓用戶知道系統(tǒng)用戶名和密碼。 passwd文件默認(rèn)并不存在,我們必須自己創(chuàng)建。文件中的密碼字段使用MD5加密,不幸的是CVS沒有提供添加用戶名的命令,所以我們借用Apache的命令來完成這項工作:

#htpasswd passwd username

這個命令為username指定密碼,并保存在passwd中,文件不存在時會自動創(chuàng)建。

htpasswd命令不是為CVS而設(shè),因此總有一些遺憾,它不能自動添加映射到的用戶名,不過沒關(guān)系,我們設(shè)置好密碼后,自己把這部分加上。我的做法是映射到cvsroot用戶,形成如下文件:

test:****:cvsroot

如果需要映射其他的用戶,請注意給相應(yīng)的目錄設(shè)置好權(quán)限,否則CVS用戶可能無法訪問源代碼倉庫。要徹底防止使用系統(tǒng)帳號登陸,可以編輯CVSROOT目錄下的config文件,把: #SystemAuth=no 這一行前面的#去掉,CVS就不會驗證系統(tǒng)用戶了,否則當(dāng)用戶名不在passwd文件中時,CVS會進(jìn)行系統(tǒng)用戶的驗證。(config也是受版本控制的,不能直接更改,需要checkout 再更改,然后再commit)

此外還必須配置讀寫權(quán)限,使用CVSROOT目錄下的readers和writers文件進(jìn)行這個工作。這2個文件默認(rèn)也是沒有的,沒關(guān)系,自己創(chuàng)建就可以了。readers文件記錄擁有只讀權(quán)限的用戶名,每行一個用戶;writers文件記錄擁有讀寫權(quán)限的用戶名,也是每行一個用戶。注意, readers文件比writers優(yōu)先,也就是說出現(xiàn)在readers中的用戶將會是只讀的,不管writers文件中是否存在該用戶。配置完畢,先測試一下:

#cvs -d :pserver:username@127.0.0.1:/home/cvsroot/cvsdata login 這里假設(shè)用戶名是username,本機登陸。出現(xiàn)密碼提示,輸入正確的密碼后,登陸成功。如果提示訪問被拒絕,請檢查用戶權(quán)限、目錄權(quán)限以及防火墻設(shè)置。建議設(shè)置環(huán)境變量CVSROOT:

#export CVSROOT=:pserver:username@127.0.0.1:/home/cvsroot/cvsdata

以后就不需要輸入-d參數(shù)了,但-d參數(shù)會覆蓋這個環(huán)境變量的設(shè)置。

5.    從eclipse中添加文件到cvs 代碼倉庫

指定Repository位置

  • Windows -> Open Perspective -> Other
  • 選擇CVS Repository Exploring項,打開CVS Repository Exploring
  • 在CVS Repositories視圖中右擊,選擇New -> Repository Location
  •  指定CVS主機名和Repository路徑(帶/的Repository名)
  •  指定用戶名和密碼
  •  指定通信協(xié)議,通常使用pserver
  •  點擊Finish創(chuàng)建Repository位置信息

共享工程

  • 在Navigator視圖中右擊工程名,選擇Team -> Share Project
  • 選擇已創(chuàng)建的Repository位置(也可以在此處新建)
  • 缺省使用工程名作為模塊名
  • 向?qū)У淖詈笠豁擄@示工程中將要被提交和追加的文件,點擊Finish完成共享,期間對提交和追加確認(rèn)都選擇Yes,并可以輸入描述性注釋

6. 源代碼倉庫的備份和移動

基本上,CVS的源代碼倉庫沒有什么特別之處,完全可以用文件備份的方式進(jìn)行備份。需要注意的只是,應(yīng)該確認(rèn)備份的過程中沒有用戶提交修改,具體的做法可以是停止CVS服務(wù)器或者使用鎖等等。恢復(fù)時只需要把這些文件按原來的目錄結(jié)構(gòu)存放好,因為CVS的每一個模塊都是單獨的一個目錄,與其他模塊和目錄沒有任何瓜葛,相當(dāng)方便。甚至只需要在倉庫中刪除一個目錄或者文件,便可以刪除該模塊的一些內(nèi)容,不過并不建議這么做,使用CVS的刪除功能將會有一個歷史記錄,而對倉庫的直接刪除不留任何痕跡,這對項目管理是不利的。移動倉庫與備份相似,只需要把該模塊的目錄移動到新的路徑,便可以使用了。如果不幸在備份之后有過一些修改并且執(zhí)行了提交,當(dāng)服務(wù)器出現(xiàn)問題需要恢復(fù)源代碼倉庫時,開發(fā)者提交新的修改就會出現(xiàn)版本不一致的錯誤。此時只需要把 CVS相關(guān)的目錄和文件刪除,即可把新的修改提交。

7. 更進(jìn)一步的管理

CVSROOT目錄下還有很多其他功能,其中最重要的就是modules文件。這個文件定義了源代碼庫的模塊,下面是一個例子:

Linux Linux

Kernel Linux/kernel

這個文件的內(nèi)容按行排列,每一行定義一個模塊,首先是模塊名,然后是模塊路徑,這是相對于CVS根目錄的路徑。它定義了兩個模塊,第一個是Linux模塊,它位于Linux目錄中,第二個是Kernel模塊,這是Linux模塊的子模塊。 modules文件并非必須的,它的作用相當(dāng)于一個索引,部分CVS客戶端軟件通過它可以快速找到相應(yīng)的模塊,比如WinCVS。

8. 協(xié)同開發(fā)的問題

 默認(rèn)方式下,CVS允許多個用戶編輯同一個文件,這對一個協(xié)作良好的團隊來說不會有什么問題,因為多個開發(fā)者同時修改同一個文件的同一部分是不正常的,這在項目管理中就應(yīng)該避免,出現(xiàn)這種情況說明項目組內(nèi)部沒有統(tǒng)一意見。而多個開發(fā)者修改文件的不同部分,CVS可以很好的管理。如果覺得這種方式難以控制,CVS也提供了解決辦法,可以使用cvs admin -l進(jìn)行鎖定,這樣一個開發(fā)者正在做修改時CVS就不會允許其他用戶checkout。這里順便說明一下文件格式的問題,對于文本格式,CVS可以進(jìn)行歷史記錄比較、版本合并等工作,而二進(jìn)制文件不支持這個操作,比如word文檔、圖片等就應(yīng)該以二進(jìn)制方式提交。對于二進(jìn)制方式,由于無法進(jìn)行合并,在無法保證只有一個用戶修改文件的情況下,建議使用加鎖方式進(jìn)行修改。必須注意的是,修改完畢記得解鎖。從1.6版本開始,CVS引入了監(jiān)視的概念,這個功能可以讓用戶隨時了解當(dāng)前誰在修改文件,并且CVS可以自動發(fā)送郵件給每一個監(jiān)視的用戶告知最新的更新。

9. 建立多個源代碼倉庫

如果需要管理多個開發(fā)組,而這些開發(fā)組之間不能互相訪問,可以有2個辦法:

a.共用一個端口,需要修改cvspserver文件,給server_args指定多個源代碼路徑,即多個—allow-root參數(shù)。由于xinetd的 server_args長度有限制,可以在cvspserver文件中把服務(wù)器的設(shè)置重定向到另外一個文件,如: server = /home/cvsroot/cvs.run 然后創(chuàng)建/home/cvsroot/cvs.run文件,該文件必須可執(zhí)行,內(nèi)容格式為:

 #!/bin/bash

/usr/local/bin/cvs -f --allow-root=/home/cvsroot/cvsdata/src1 --allow-root=/home/cvsroot/cvsdata/src2 pserver 注意此時源代碼倉庫不再是/home/cvsroot/cvsdata,進(jìn)行初始化的時候要分別對這兩個倉庫路徑進(jìn)行初始化,而不再對/home/cvsroot/cvsdata路徑進(jìn)行初始化。

b. 采用不同的端口提供服務(wù)重復(fù)第2步和第3步,為不同的源代碼倉庫創(chuàng)建不同服務(wù)名的啟動腳本,并為這些服務(wù)名指定不同的端口,初始化時也必須分別進(jìn)行初始化。 '

10.     一些版本管理的概念:

版本(Revision)
每一個文件的各個版本都不相同,形如1.1, 1.2.1,一般1.1是該文件的第一個revision,后面的一個將自動增加最右面的一個整數(shù),比如1.2, 1.3, 1.4...有時候會出現(xiàn)1.3.2.2,原因見后。revision總是偶數(shù)個數(shù)字。一般情況下將revision看作時CVS自己內(nèi)部的一個編號,而 tag則可以標(biāo)志用戶的特定信息。
標(biāo)簽(Tag)
用符號化的表示方法標(biāo)志文件特定revision的信息(一般是一個有意義的字符串,比如PreRelease2)。通常不需要對某一個孤立的文件作tag,而是對多個文件(甚至一個項目的所有文件)同時作一個tag,以后用戶可以僅向特定tag的文件提交或者checkout。另外一個作用是在發(fā)布軟件的時候表示哪些文件及其哪個版本是可用的;各文件不同revision可以包括在一個tag中。如果命名一個已存在的tag默認(rèn)將不會覆蓋原來的; Tags are a great way of keeping track of significant events in the life of your project’s code.
分支(Branch)
當(dāng)用戶修改一個branch時不會對另外的branch產(chǎn)生任何影響。可以在適當(dāng)?shù)臅r候通過合并的方法將兩個版本合起來; branch總是在當(dāng)前revision后面加上一個偶數(shù)整數(shù)(從2開始,到0結(jié)束),所以branch總是奇數(shù)個數(shù)字,比如1.2后面branch為 1.2.2,該分支下revision可能為1.2.2.1,1.2.2.2,...

Release:發(fā)行版本