歡迎您光臨本站 註冊首頁

用LINUX作CVS伺服器

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  1版本控制的概念以及幾種版本控制工具的簡介

1.1源文件的標示與版本的概念

源文件是一個軟體最為重要的一個組成單元,因此源文件的管理也是整個軟體組成管理中最重要的一環,是進行高效軟體開發的關鍵歲所在.對源文件進行管理,必須對源文件進行標示.通常認為只需文件名.而實際上,在一個版本維護工具下對於源文件的標示包括兩部分:文件名與版本.即:源文件可以用如下的二元組表示 {filename,version};

所謂版本,一般的軟體開發人員都有一個直觀的理解,但卻很難做出準確的定義.版本,是指某一特定對象的具體實例的潛在存在.這裡的某一特定對象是指由版本維護工具管理的如軟體組成單元,一般指源文件.具體實例則是指軟體開發人員從軟體儲藏室中恢復出來的軟體組成單元的具有一定內容和屬性的一個真實拷貝.

把版本定義成一個潛在的存在是基於以下考慮:版本作為源文件的一個表示部分,軟體人員對它的引用實際上想得到不同的版本對應的不同源文件,所以說版本是一種抽象.它用來定義一個具體實例應該具有的內容與屬性.也就是說版本是一個具體實例的潛在存在,是源文件不同化身的抽象.

有了以上對版本概念的認識.大家對版本維護工具就有了一定的理解:版本維護工具,應該對開發人員屏蔽源文件的存儲方式對開發人員是透明的,開發人員不需要明白軟體存儲庫里有什麼源文件,只需要說明需要什麼樣的源文件以及要存儲什麼樣的源文件,版本維護工具自動完成這一切工作.關於版本維護的理論還包括:版本的空間,維數,版本的表示,存儲,合併等理論,因為我們這裡主要說明cvs 的linux 伺服器,所以一切從簡,對這方面有興趣朋友可以閱讀相關書籍

本章所講的cvs 就是這樣的一個強大的工具.在講述cvs 前我們先介紹其他幾個版本維護工具.

1.2 幾種版本維護工具的簡介

1.2..1 SCCS

SCCS的全稱是Source Code Control System .在介紹之前先定義工作文件的概念.所謂工作文件,是指從軟體儲藏室得到的有」寫」許可權的源文件.

SCCS 是一種基本的源文件版本控制工具,它適用於任何正文文件的版本維護.它基於單一文件的版本控制,通常,它的軟體儲藏室和要維護的文件在同一目錄下.

SCCS 工作時,有一個專門的SCCS 格式的文件保留其源文件的編碼版本,其記錄了足夠的信息來生成新的版本,並記錄了誰對文件有修改權,擁有該版本的」鎖」.


SCCS的版本好事一個四元組,即:發行號,級號,分支號,序號(release,level,banch,sequence)


1.2.2 RCS

RCS是另一種基本的源代碼管理工具,是WALTER.f.Tichy 於1980 年在Indina的 Purdue 大學開發的.RCS和SCCS 類似,也是基於單一文件的版本維護系統.RSC 通過RSC 文件進行文件管理;使用RCS 進行維護的過程與SCCS 相似,也是按恢復提交模式進行的,不多贅述

RCS文件,是RCS 系統中源文件的儲藏室,它是一種特殊的編碼文件,包含了開發人員恢復老版本的源文件以供開發使用的足夠信息.它通常是以.V 為後綴

它的結構如下:

? RCS 頭,這一部分記錄了對應文件的版本樹的頭版本號,

? 版本描述: 這一部分描述RCS樹上的各個節點的屬性性質

? 初始信息:之一部分是在創建第一個RCS 版本時的表述內容

? 文件內容

RCS與SCCS 相似,RCS將所維護的版本也組織成樹形結構.但RCS允許多重分支,即,RCS的版本號不像SCCS那樣是一個四元組.形式為;發行號,級號,[分支號,序號].版本樹如下

1.2.3綜述:

這兩種版本維護工具的共同點是:採用了」鎖」的方式,對當前問堅持有」鎖」的用戶才有對文件的修改權.他們採用的機制是所謂的」 lock-modify-unlock」.採用這種即只有一個知名的弱點,那就是不至此多用戶併發的使用.

2 在linux 下構建cvs 伺服器

2.1 CVS簡介及基本原理

CVS 的全稱是Current Version Control. CVS是一種GNU 軟體包.由Intersolv公司開發,最新的版本是1.10.8.它是一種基於RCS系統的維護工具.它明確的將源文件的存儲和用戶的工作空間獨立開來,有在一定的模式上擴展了RCS的恢復提交功能. 並使其有利與并行開發.

CVS 將源文件的RCS 文件根據其源碼樹的層次集中在一個目錄下,該目錄的絕對路徑由環境變數CVSROOT 定義
 

可見該目錄可以分成兩部分:一部分為${CVSROOT}/CVSROOT,它包含CVS所需的一些管理 文件.另一部分為源文件所形成的RCS 文件,並按軟體開發的源碼樹的結構來構成. 

關於CVSROOT 下的文件,在以後的章節,有詳細的講解,,而源代碼目錄下的工作空間結構 

CVS 在進行源代碼管理是有以下特點:

1,源代碼空間與用戶空間分離.

CVS 系統將源代碼文件放在repository下,用戶要修改文件必須將repository 下的文件作一個拷貝之後才能進行,

2,併發訪問

CVS 系統允許多個開發人員同時獲取同一文件的的同版本源文件.當然這也是CVS獲得廣泛應用的主要原因.開發人員提取一個文件時,將在自己的工作空間建立一個與其他開發人員相互獨立的拷貝,此文件的版本號與文件「頭」版本相同,除非他用commit 命令完成版本的永久性升級.而此時,其他用戶可用undate 命令是自己的版本號與」最新的頭版本號」相一致.:若用戶在checkout 后發現頭版本改變了,可用RCS系統的rcsmerge 命令形成一個新文件,這個新文件及包括原來的內容,又包括用戶修改的內容.此示弱與其他同時在對同一文件修改的開發人員發生衝突,可通知他們進行手工修改

所以說,CVS系統是一個Copy-Modify-Merge 的演算法而不是以上我們提到的那兩個系統所採用的lock-modify-unlockj機制 這種演算法的好處在於,軟體開發人員可以得到一份源文件的拷貝(Copy),並不會對該文件上」鎖」,因此為并行開發提供了可能,在得到 拷貝后, 開發人員可以在自己的開發環境下進行修改(Modify),然後提交自己修改後的文件,與源文件進行合併(Merge).形成新的版本,

3,源文件共享

CVS對${CVSROOT}的使用是不同的用戶可按自己的需要拷貝不同的模板,修改後載體交給${CVSROOT}.這樣用戶可共享源文件.這當然是我們建立CVS伺服器所必需的

4,獨立的工作環境

用戶在自己的工作環境下進行修改開發,自然有獨立的工作環境,值得說的實.CVS 也支持」鎖」的機制.允許用戶對自己獲得的模板拷貝進行鎖定

5,標記

CVS為了方便用戶,引入了一個tag文件,該文件位於用戶工作目錄下,與被他標記的文件一級的CVS 目錄下對特定的tag 文件操作,即對相應版本的操作,即使這個版本被修改過.

2.2.CVS 的獲得安裝

CVS 在一般的linux發行版本中都有默認的安裝.如果你的系統沒有安裝也沒有關係,CVS可以在intenet 上很方便的得到. 它的源碼在ftp://202.113.29.4/pub1/unix/cvs 它的說明文檔在ftp://202.113.29.4/doc/cvs.任何人可以很方便的下載.目前他的最新版本是2..10.8..

安裝過程大致如下:

1,在任一目錄下解開下載的壓縮文件.

2利用文件包內的安裝工具,完成安裝,(內有說明文檔). 通常是:

make config

make install

(不通版本的,安裝方法可能不同,具體的請參見,它自身所帶的安裝文檔)

 

2.3伺服器的安裝使用

在安裝完CVS 系統后我們便可以開始CVS倉庫的安裝. 在linux環境里,CVS的使用一般是以命令行方式,也有一些GUI的前端工具,如TKCVS等.這裡我們將應用CVS 的一般命令即 cvs [cvs的選項] cvs-command [command 選項] 的方式完成伺服器的配置.

2.3.1軟體倉庫(repository)的管理

1創建CVSROOT根目錄

首先編輯有關的環境變數.(CVS的幾個重要的環境變數如下:

CVSROOT 倉庫根目錄的完整路徑名

CVSREAD 如果設置,表明在checkout操作時所有的文件都置成只讀

CVSBIN CVS利用了很多RCS的命令,指定樂RCS工具的路徑

CVSEDITOR 指定用戶書寫日誌信息所使用的編輯器

CVS_RSH 啟動一個遠程CVS伺服器時,所使用的shell的名稱

CVS_SERVER 決定"cvs server"的名字,預設是CVS

CVSWRAPPERS cvswrapper腳本, 用來指定包裝文件名.)

其中中重要的是CVSROOT,它指明了倉庫所在的位置,在創立新的倉庫時,它是必不可少的.因此一般需要加入環境變數CVSROOT的定義.如在 /etc/bashrc 文件中加入下面兩行

CVSROOT=/cvsroot

export CVSROOT

或者直接在命令行上執行

$ export CVSROOT=/cvsroot

然後在相應位置開始創建CVSROOT

$mkdir cvsroot

$cvs init

如果沒有定義變數CVSROOT 會出現這樣的提示:

cvs init : No CVSROOT specified! Please use the 『-d』 option

cvs [initn aborted]:or set the CVSROOT environemnt variable

如果你是在不想定義環境變數,你可以用這樣的命令:

cvs ?d /cvroot init 不過即使你定義了CVSROOT,參數 ?d 后的內容也會覆蓋它.如果沒有錯誤提示, 恭喜你, 你的CVS 軟體庫已經建立好了.

剩下的問題就是怎樣時多用戶來使用這個倉庫來進行并行的軟體開發與版本控制.還有作為CVS 管理員你應該設置你的用戶的許可權. 此時,你的cvsroot 下有一CVSROOT 子目錄.他下面的文件時CVS 的配置文件,用

ls /cvsroot/CVSROOT 有一系列文件,他們的用途分別是:

checkoutlist 支持CVSROOT目錄的其它管理文件,允許為各種CVS命令定置信息

commitinfo 在cvs commit命令執行時,這個文件指定樂文件提交時執行的命令

cvswrappers 定義樂一個包裝程序當文件登記或檢取時就會執行.

editinfo 允許你在commit命令啟動前在日誌信息被記錄后執行的腳本

history 跟蹤所有影響倉庫的命令

loginfo 類似coimmitinfo, 只是在文件提交后執行

modules 允許為一組文件定義一個符號,否則必須為每一個要引用的文件指定cvs倉庫的路徑名($CVSROOT)

nitify 控制從"watch"來的通知."watch"由"cvs watch add"和"cvs edit" 設置

rcsinfo 為commit log回話指定一個模板.

taginfo 定義樂在任意"tag"操作后執行的程序.

Passwd 預設沒有.存儲用戶passworld的文件

設置管理許可權:

   源碼管理員應對倉庫下的文件和目錄設置恰當的許可許可權來控制訪問. 所有的RCS文件(以,v結尾)是只讀方式,倉庫中的目錄應當對使用者有寫權,以便允許其更改.

3.2.2多個軟體庫的建立

如果你有幾個開發組, 他們的工作毫不此相干,你完全可以建立幾個不同的軟體庫.你要做的只是要重新定義一下環境變數CVSROOT,或者,使用-d 來設置,使用多個軟體庫的好處是,他們可以在不同的sever上,CVS 1.0 版還不能用一條命令來從不同的軟體庫中取出文件,在她以後的版本中,你可以將不同SEVER 上的源碼取到你的工作目錄下. 以下是一個怎樣在多軟體庫下建立工作目錄的例子:

cvs -d server1:/cvs co dir1

cd dir1

cvs -d server2:/root co sdir

cvs update

第一條命令建立了一個工作目錄,在sever1上取出了文件第三條命令則在sever2 上的軟體庫中取出了一些文件.然後用所有的文件使sever2 上的文件升級.

3.2.3軟體庫的備份與移動

備份軟體庫中的文件和備份其他文件並沒有不同,但你需要一個備份工具開鎖住CVS.這樣,你必須先註冊一個可以讀取軟體庫的用戶,打開CVS軟體庫, 你需要編輯`#cvs.rfl』文件.

當你想用一備份的軟庫,恢復原來的庫時,如果原庫在你備份後作過改動.CVS將報錯.你必須按以下的步驟來

? 得到一個新的工作目錄

? 拷貝上一次提交失敗的文件(,當然不能拷貝CVS的目錄文件)

? 在新目錄下工作,使用cvs update 或cvs diff 等命令指出那些作過改動,在使用cvs commit 將改動保存到軟體庫.

你如果想移動一個軟體庫到其他地方也很簡單.最簡單的方法是將向要移動的目錄創到一個新的目錄中去.如果你想重新使用原來的目錄的話,只能手工修改`CVS/Repository 和 `CVS/Root,除非你精於此道,否則不建議使用.

3.2.4軟體庫的遠程使用我們放到下一節中詳細講解

3.3CVS 的遠程用戶管理

作為一個CVS 伺服器,應該滿足兩點.首先保證軟體庫有足夠大的空間. 其次保證有不小於32M 的內存, 伺服器為每一個連接它的用戶產生兩個進程,在子進程上的花銷較小.但如果網路帶寬不夠,在父進程上的花銷是巨大的.

另外一個大的花銷是diff 文件,當源文件很大時,對他進行驗證或檢測的花銷也很大.

3.3.1下面我們已普遍使用的rsh 進行遠程登錄為例子,講一下遠程用戶的登錄認證方式:

Cvs 伺服器使用rsh 允許用戶連接時應該配置.rshosts ,假設在遠程主機tom.exsample.com 上的用戶tom 需要連接到funame.simple.com 這個cvs 伺服器上工作.應該編輯伺服器端的bach 目錄的.rshosts ,在其中加入

Tom.exsample.com tom

客戶端可運行 rsh ?l bach funame.simple.com 『 echo @PATH

以確定自己可以連接到CVS 伺服器上,並且客戶應將顯示的這個路徑寫入 .bashrc 或 cshrc (而不是.logiin 或.profile.)

除此之外,客戶端還可以定義環境變數CVS_SEVER.來定義主機的位置. 在伺服器端,修改/etc/ineted.conf文件,來告訴伺服器,在獲得特定埠的連接時,運行cvssever .這個埠號預設值是:2041.當然為了不再每次使用時都要進行設置,可以在用戶端通過定義環境變數CVS_AUTH_PORT來使用.

如客戶端的ineted 允許使用原始調用,只需在/etc/ineted.conf 文件中添加下面的句子即可2401 stream tcp nowait root/usr/local/bin/cvs cvs ?f ?allow ?root=/cvsroot pserver

另外還可以用- T 選項來定義緩衝目錄.

—allow ? root 定義了可供用戶使用的軟體庫,如果伺服器上有更多的軟體庫需要重新使用這個句子. 另外,內部用戶可以這樣定義環境變數CVSROOT

:pseve:usr@funam.simple.com:/cvsroot

其中 usr是用戶名(linux系統的)funam.simple.com 是cvs 伺服器,並假設 /cvsroot是軟體庫的目錄名.遠程用戶可用下面的形式:

:etx:psever:usr@funam.silple.com:/cvsroot

:etx: 定義了是遠程用戶,其餘同上.

如果客戶的ineted 採用一般調用,只需在 /etc/seveice 中加入下面這一句:

cvspsever 2401/tcp

重新啟動ineted 使其讀取初始化文件即可.

CVS 對於用戶的管理.在預設狀態下(如用telnet登陸),是和linux 系統使用同樣的用戶名與密碼.即:只要你登陸linux 系統,就擁有$CVSROOT的只讀許可權..當然,對某一軟體的開發者來說必須擁有相對應目錄的讀寫許可權,才能完成源代碼的升級等工作.因此,CVS 也提供了自己的用戶認證體系以更加方便的管理用戶.

在伺服器端的$CVSROOT/CVSROOT 下可以有一個passwd 文件(可以用環境變數CVS_PASSFILE 來定義.)來記錄cvs的用戶信息.他採用的是和linux etc/passwd 同樣的組織形式 .同樣,它的passwold 也是經過linux標準加密方式的.下面是一個passwd 的內容

anyone:

tom:xyzkue

mary:yuio:pubcvs

第一行的意思是,當用anyone 的身份登錄時,不需要任何密碼.即使打入空串也可以.當然在這種方式下你得到的可能只是只讀權.第二行的意思是,tom 登錄時需要敲入passwold.該passworld 加密后是xyzkue.以這種方式登錄后.一般可以獲得較高的許可權.

第三行的意思是,當mary 登錄時需要敲入密碼.進入和系統用戶相同的軟體庫.這樣作的目的是因為.cvs 將紀錄它的用戶在軟體庫中的所有的動作.定義和系統使用者不同的身份.使用cvs.

例如;使用用戶tom可以用以下的方式登錄:

$cvs ?d :etx:tom@funam.simple.com:/cvsroot login

(如果tom 這個用戶名在遠端可內部是相同的,則tom@ 還可以省略)

同時,可以使用cvs loginout 將所有的環境變數撤銷.

3.3.2,使用GASSAPI 接入

CVS 還支持使用 GASSAPI 的TCP 直接接入.在使用安轉之前,需要將CVS 重新編譯以獲得 GASSAPI 的支持.運用 ?with ?gassapi 來連接,或者用-a 選向來連接.使用GASSAPI 的認證等方式餘地一種方式相同.

但在登錄時.需要重新定義$CVSROOT 如:

$cvs ?d :gsever:usr@cvssever.com:/cvsroot login

3.3.3使用kerberos 直接連接

最簡單的使用rsh 的方法如上說述.這種方法的主要特點是所有數據都通過一個額外的程序.非常費時.如果安裝了kerberos.可以直接用TCP 連接.

同樣CVS 需要重新編譯以獲得keberos的支持可用--with-krb4 來連接.這樣傳輸的數據是沒有加密的.如果要獲得安全.必須在服務端和客戶端都用`--enable-encryption來連接.此時,你應用通用的變數-x來要求加密.

在服務端需要編輯inetd.conf 來運行cvs kserver .客戶端的預設埠號是1999,如果想用其他埠號.需在用戶端定義CVS_CLIENT_PORT

此時的登錄命令應是

cvs -d :kserver:faun.example.org:/usr/local/cvsroot checkout foo

3.3.4用fork連接

用這方式,可以通過遠程協議連接本地硬碟的軟體庫.換句話說,他能和:local:有相同的功能用這種方式的登錄命令是

cvs -d :fork:/usr/local/cvsroot login

和用:etx:一樣.預設的主機名是cvs

4 cvs伺服器架與應用實例

4.1伺服器安裝配置

假設目前有一工作項目,需要用cvs 來管理員碼.這個開發組為內部3人,器ip 分別是:192.168..1.2(用戶名t1),192.168.1.3)(用戶名時t3),193.168.1.3(用戶名t3),遠程用戶一人,其主機是 tom.example.com.(用戶名是tom)

如果你已經安裝了cvs,建立一cvs 主機為 cvs.exam.org的伺服器非常簡單.步驟大致如下:

1)以root 身份登錄.建立軟體庫(repository)

$export CVSROOT=/cvsroot

$mkdir /cvsroot

$cd /cvsroot

$cvs init

2)設置執行許可權

$chmod /cvsroot/CVSROOT 744 (/ccvsroo/CVSOOT設置為只讀)

$chmod /cvsroot 764 組號 (/cvsroot 對開發組可讀寫)

3)修改文件以利於其他人使用,因為開發組人員是系統用戶,所以在這裡用系統的用戶名和password是比較好的.先編輯.rhosts件如下:

tom.example.com. tom

修改伺服器上的 /etc/inetd.conf文件,加入如下的句子

2401 stream tcp nowait root /usr/local/bin/cvs cvs -f --allow-root=/usr/cvsroot pserver

這樣一來,一個基本的cvs 伺服器就建好了.

我們這裡只是提供了一個基本的應用.cvs 真正的細節應用非常複雜.我們這裡只進行一些拋磚引玉的介紹.與興趣的朋友可以細讀它的安裝文檔.

4.2應用實例

(使用主機上的cvs 系統,可以telnet 到主機上,然後使用,和本機使用沒什麼差別,所以本文一直不提)

假設上例中的tom 想使用 cvs 主機上的cvs系統以和大家協作開發.首先它營配置自己的一些環境變數.首先編輯/etc/services加入:

cvspserver 2401/tcp

然後在.profile 文件中加入如下代碼

CVSROOT=:etx:psever:tom@cvs.exam.org:/cvsroot

Export CVSROOT

這樣他便可以使用$cvs login 來登錄了.下面我們便以tom 的具體使用為例子講一下cvs 的應用.和其他linux 命令一樣.cvs 也有大量的參數.我么將在下一節做一個列表.

Tom 在/usr/test 目錄下有如下文件

Ecample.c exampl2.c tes1.c test2.c utimel.c tty.c

如果想在軟體庫建立自己的目錄

$cd /usr/test

~test$ cvs import ?m 「tom first creation」 tomdir tom tomwork

N tomdit/example.c

N tomdit/exampl2.c

N tomdir/test1.c

N tomdir/test2.c

N tomdir/utmel.c

N tomdit/tty.c

No conflicts creat by this import

命令說明 import 提交命令 ?m 后加描述.tom 發行商 tomwork 是發行標號.如果提示CVSROOT 不對,可以用- -d 加CVSROOT

 

注:一切cvs 的命令 可以用 cvs command ?H 來獲得幫助. 這時伺服器端的/cvs 目錄下多了一個 tomdir 子目錄.內容下:

example.c,v exampl2.c,v test1.c,v test2.c,v tty.c,v utimel.c,v

至此首次提交完成.

這樣便是一不小心刪除了test 目錄也不用擔心.使用如下命令,可從軟體庫中檢出源文件的備份

$/cd usr

`usr$/cvs checkout test tomdir-r 1.1

U test/exsample.c

U test/exampl1.c

U test/test1.c

U test/test2.c

U test/tty.c

U test/ulnem.c

cvs checkout命令預設是得到最新版本.我們也可以得到某一個老版本,此命令是將tomdir的1.1版的代碼取出. 恢復后test 目錄增加了一個CVS 目錄是用來管理的,以便在你下一次提交或修改的時候,和伺服器上的管理文件相介面,保證版本好.這個例子非常小,現實中工程非常可能文件非常多,這樣可以先恢復 CVSROOT 的模塊

~usr/$cvs checkout CVSROOT/mouldes

~/usr/$vi CVSROOT/mouldes 編輯模塊名,如我們在文件尾加上

src project/src

print project/src/print

cvs commit

以後我們就可以用cvs checkout print來代替

cvs checkout project/src/print

編輯完后即可以提交文件

~usr/$cvs commit ?m 「edit of mouldes name」 CVSROOT/mould除了可以恢復整個目錄后也可以恢復單個文件或模塊

~usr/test/$cvs checkout ?m 「newer file 「 tty.c

在恢復了文件以後, tom 便可以使用各種編輯器,對源文件進行修改,修改完成以後就可以提交它的工作成果了

~/usr/cvs commit test tomdir.

這樣,tom 便完成了一次源文件的升級.其他的同理可得

4..3在管理中的相關技術

4.3.1 在管理源文件的一種技術叫"關鍵字替換".在每次執行"cvs commit"操作后源文件的某些關鍵字會被替換為可用的詞

$AUTHOR$ 用戶名

$Data$ 登記時的時間

$Header$ 標準的首部,包含RCS的完整路徑名,日期,作者

$Id$ 除RCS文件名不完整外與$Header$同.

$Log$ 包含RCS的完整路徑名,版本號,日期,作者和在提交時提供的日誌信息.

$RCSfile$ 包含RCS的文件名,不包括路徑名

$Revision$ 分配的版本號

$Source$ RCS文件的完整名

$State$ 分配的版本的狀態,由 cvs admin -s 分配.

例: 在cvs commit之前,main.c里有

static char *rcsid="$Id$";

執行cvs commit后

main.c的改行變為:

static char *rcsid="$Id: main.c,v 1.2 1999/04/29 15:10:14 trimblef Exp$";

當然,這裡只是一個演示.在實際的程序開發中,這種技術有非常有用的作用,在此不多贅述.有興趣的朋友可參考相關書籍.

4.3.2 創建分支可以使用戶對一些文件使用命令commit進行修改時不會影響主幹. 創建分支應首先為擬作修改的那些文件創建一個標籤(tag).

標籤是賦於一個文件或一組文件的符號.在源代碼的生命周期里,組成一組模塊的文件被賦於相同的標籤.在工作目錄中執行

~usr/teat/$cvs tag release-1-0

標籤創建后, 就可以為其創建一個分支:

~usr/teat/$cvs rtag -b -r release-1-0 release-1-0-path print

-b :創建分支

-r release-1-0 :指定存在的標籤

releas-1-0-patch:分支

print: 模塊名

使用cvs update -j 選項可以將分支上的改變與本地文件拷貝合併.

~usr/teat/$cvs update -j release-1-0 print.c

對源文件作必要修改後, 可以用cvs release 刪除本地工作拷貝

並通知其他開發者這個模塊不再使用.

~use/$cvs release -d test

4.3.3 衝突解決

在有多個用戶對同一個文件進行修改時,如果修改了其中的相同部分,而修改後的內容如果有不同的話,出現衝突是不可避免的。

例如在CVS 文件倉庫中有一個文件 test.c ,它的版本是 1.4, 用戶A 先檢出該文件進行修改,而稍後有用戶B 檢出該文件進行修改,並提前提交成 1.5,這樣在用戶A再提交時就會出現衝突,這時CVS會提示需要手工解決。

例如,文件倉庫中的版本1.4:內容為:

#include

main()

{

int i;

for(i = 0; i < 100; i++)

printf(「Count: %d\n」, i);

}

用戶B 1.5:

#include

main()

{

int i;

for(i = 0; i < 10; i++)

printf(「Count: %d\n」, i);

printf(「Over\n」);

}

用戶A :

#include

main()

{

int i;

for(i = 0; i < 50; i++)

printf(「Count: %d\n」, i);

return;

}

提交時會提示有衝突,這樣需要手工編輯,這時如果用戶A運行了$cvs update 之後,再編輯test.c, 會看到test.c 的內容是這樣的:

#include

main()

{

int i;

<<<<<<< test.c

for(i = 0; i < 50; i++)

=======

for(i = 0; i < 10; i++)

>>>>>>> 1.5

 

printf("Count: %d\n", i);

<<<<<<< test.c

return;

=======

printf("Over\n");

>>>>>>> 1.5

}

這樣就需要,根據任務的不同,來手工修改,這是比較麻煩的,所以在真正的協作開發中,很少,對同一個文件給與,很多人相同的提交許可權.

4.3.4文件版本管理

版本管理系統,最重要的莫過於對文件版本的管理,系統默認的版本升級使用的版本號是一定的.如果由於特殊需要,要自己定義出文件的版本號時,你可以用一下命令:

cvs log [-lR][-r rev][-d date][-w login][files…]

其中,參數的意義如下:

-l 不處理子目錄

-R 對子目錄做同樣處理

-r 指定版本號

-d 指定時間

-w 指定登錄名

使用下面的命令可以參看當前模塊的版本號或指定文件的所有歷史版本信息。

cvs annotate [-lR][-r rev|-D date] files

其中,參數的意義如下:

-l 不處理子目錄

-R 對子目錄做同樣處理

-r 指定版本號

使用下面的命令可以參看指定文件(檢出之後)的所有修改信息。

$cvs annotate cvstest/c/test.c

輸出依次為:版本 修改人 修改時間 源代碼

1.1 (tang 18-Jan-00): #include

1.1 (tang 18-Jan-00): #include

1.1 (tang 18-Jan-00):

1.1 (tang 18-Jan-00): main()

1.1 (tang 18-Jan-00): {

1.1 (tang 18-Jan-00): int i = 0 ;

1.1 (tang 18-Jan-00):

1.1 (tang 18-Jan-00): for(i = 0; i < 20; i++)

1.1 (tang 18-Jan-00): printf("Count: %d\n", i);

1.1 (tang 18-Jan-00):

1.3 (tang 18-Jan-00): printf("222222\n");

1.4 (tang 18-Jan-00): printf("333333\n");

1.1 (tang 18-Jan-00): }

使用下面的命令可以生成相對於一個指定主版本的分支版本:

cvs rtag ?b ?r rev_root rev_branch file_name

其中,參數的意義如下:

-b 指定生成一個分支版本

-r 指定該分支的主幹節點版本號

rev_root 主幹版本號

rev_branch 分支版本號

file_name 指定文件,使用「.」表示當前目錄下所有文件

使用下面的命令可以生成一個對應版本號的分支版本,由於CVS 版本號是用數字錶示的,而且在同一個模塊下不同文件的版本完全可能是不同的,所以使用標識會更方便。

例:

$cvs rtag ?b ?r 1.2 tlb-1 SOURCE

以後要訪問該分支版本,可以使用「-r」 選項

$cvs checkout ?r tlb-1 SOURCE

從當前檢出的版本切換到一個分支版本:

$cvs update ?r tlb-1 SOURCE

使用下面的命令可以看版本信息:

cvs status [?vlR] files

其中,參數的意義如下:

-v 顯示所有信息

-l 不顯示子目錄信息

-R 顯示子目錄信息

命令:cvs update ?j rev module 把當前所做的修改與指定版本的文件進行合併。

如:主幹 1.1 1.2 1.3 1.4 1.5 1.6 ↓

分支tlb-1 1.2.2.1 1.2.2.2 1.2.2.3

如果要合併分支tlb-1上的版本:

$cvs update ?j 1.2.2.3 ?j tlb-1 test.c

其中1.2.2.3可以通過tag命令生成一個容易記憶的標識。

如果要合併分支tlb-1到主幹上1.2 :

$cvs update ?j tlb-1 test.c

如果要合併主幹上的不同版本(注意順序很重要,同時在指定版本之間的所有修改將被丟棄):

$cvs update ?j 1.5 ?j 1.2 test.c

如果在不同版本之間模塊的文件有增減,則可以:

$cvs update ?A

$cvs updata ?jbranch_name

5, 命令集

在本章的例子中,介紹了很多,命令的詳細用法,其大多數是以應用的角度,來分析的.實際上.cvs 擁有,大量的命令.如gcc 一樣cvs 常用的命令也不是很多,在本節中,我們列出了一些常用的命令.力圖不和以上各節中介紹的相重複.當然,限於時間和水平,在此也不可能列出cvs 所有的命令.有興趣的朋友.可以,參考,cvs的說明文檔,與linux 的man文檔,詳細學習,也可來此做出指導

(1)檢出源文件

cvs checkout [-r rev][-D date][-d dir][-j merg1] [-j merg2] modules

其中,參數的意義如下:

-r 檢出指定版本的模塊

-D 檢出指定日期的模塊

-d 檢出指定目錄而不是模塊

-j 合併當前版本和指定版本

使用下面的命令會檢出剛才生成的模塊,並在當前目錄下生成與文件倉庫中完全一樣的目錄結構:

usr$ cvs checkout project

usr$ cvs checkout project/src/main

cvs checkout的詳細用法見cvs -H checkout的輸出.

2)CVS commit 命令 在對文件的修改完成後,用cvs commit提交到倉庫.

cvs commit -m "Update by xxxxx" project

cvs commit -m "Update main.c" main.c

提交完成後,當前的版本號會更新,如原來為1.1,現為1.2. 這兩個版本都在倉庫的主幹(maintrunk)上.

-m選項可以記錄有關提交的註釋.如果沒有指定-m選項,在環境變數CVSEDITOR中指定的編輯器被調用(vi是預設的),提示鍵入文本,修改記錄註釋.

3) 刪除、增加、重命名文件和目錄

cvs add [-k kflags][-m message] files...

其中,參數的意義如下:

-k 指定以後該文件的預設檢出目錄

-m 對文件的描述

上述命令會加入一個新的文件到文件倉庫里,但直到使用了提交命令它才會真正更新文件倉庫。

cvs remove [options] files

上述命令會從文件倉庫中刪除文件,但也要到提交之後才有作用。

例1:增加文件

$cvs checkout SOURCE

$cd cvstest/c

$touch test.c

$cvs add test.c

$cvs commit ?m 「add test.c」

例2:刪除文件

$cvs checkout SOURCE

$cd cvstest/c

$rm test.c

$cvs remove test.c

使用 ?f 選項能上面兩步合做一步。

$cvs remove ?f test.c

如果在提交之前想恢復剛才刪除的文件,可以如下:

$cvs add test.c

如果只執行了第一步刪除(rm),則可以用下面的方法恢復:

$cvs update test.c

對於重命名的文件,可以先刪除再添加。

對於目錄的修改(重命名),可能需要修改cvs 管理文件,一般應該遵循以下步驟:假設tom正在修改文件的一部分,現想合併更新自己的本地拷貝(checkout)和另一個人所做的修改(已經放在倉庫里),可用

~usr/test/$cvs update

確認所有有關的修改都已經提交;

進入文件倉庫中要修改的模塊目錄,對相應的目錄進行修改(重命名或刪除)

$cd $CVSROOT/modules

$mv old_dir new_dir

如果有必要,修改管理文件,比如modules 文件,如果要刪除目錄,則應該先對目錄中每個文件都進行了刪除(包括使用cvs remove )處理之後再執行上面的第2步。

(4提交源文件

cvs commit [-Rl][-m mesg] files

-R 連子目錄一起提交

-l 只提交本地目錄(不提交子目錄)

-m 註釋信息

在檢出源文件之後,在工作目錄中對源文件進行的所有修改都必須在提交之後才能使文件倉庫中的源文件起作用,並且新的文件才能夠被分配一個新的版本號。

(5)釋放工作目錄

cvs release ?d SOURCE

這個命令會刪除工作目錄 cvstest/c (建議在提交了修改的模塊后執行這一步), 它比使用 rm ?rf cvstest 要好。

在此介紹了,使用cvs 伺服器進行.并行開發中常用的.命令.希望能起一個拋磚引玉的作用

5小結

本章,介紹了一些版本控制的知識.與幾種辦控制系統.並從易用的角度,講述了在linux機器上,構架cvs伺服器的過程,與cvs 簡單的使用方法

cvs 也可以說是一種網路應用程序.它的功能在於,他能提供在并行的條件下,對多用戶同時開發,便利,安全的源碼.管理模式.個人認為,cvs的出現是自由的linux的必然產物.

他也會在linux這片熱土下,得到更有前途的發展.

本章,旨在易於入手.對於cvs複雜的應用,管理過程.筆者也不是很熟悉.這需要在實際的應用中,積累經驗.學習提高.


[火星人 ] 用LINUX作CVS伺服器已經有526次圍觀

http://coctec.com/docs/program/show-post-72452.html