1.前言
版本管理系統可以幫助開發人員有效地管理軟件資源(源代碼文件、配置文件等)的版本 問題。版本管理系統可以幫助開發人員追蹤文件的修改履歷;防止文件因疏忽而被錯誤的修 改、刪除;在小組開發環境中,幫助多個開發人員保持文件的同步;通過文件的修改履歷, 還可以幫助開發人員發現修改過程中產生的BUG,因此應用CVS可以在一定程度上提高軟件的 開發效率。現在很多開發工具中都集成了CVS功能,例如ECLIPSE、InteliJ、NetBeans等;雖 然ECLIPSE等集成開發環境(IDE)對CVS提供了很好的支持,可以大幅降低CVS的使用難度, 但是很多開發人員在使用CVS時還是不知所措。筆者認為這是由於他們不了解CVS的相關術語 及CVS的工作模式所致。因此,本文首先介紹CVS的相關術語及CVS的工作模式。然後通過一些 實例與應用場景, 展示如何在ECLIPSE中使用小組開發環境。
本文所使用的ECLIPSE沒有安裝本地語言包插件,操作界面為英文。但理解了相關術語後 ,讀者即使在中文環境中也能正常操作。
2.CVS的相關術語與CVS工作模式
2.1 術語解釋
修訂版(revision):CVS版本管理系統用修訂版來管理文件的修改履歷,修訂版用版本 號來表示,即修訂版號。對文件的每次修改(提交)都產生一個新的修訂版。
資源庫(repository):資源文件的集合,版本管理的容器。在ECLIPSE中被稱為CVS存儲 庫。
模塊(module):資源文件的組織形式,在版本管理系統中的表現形式為目錄(樹形結構 ,可以嵌套)。
輸入(import):將處於資源庫之外的軟件模塊登錄到資源庫。
輸出(export):從資源庫中取出模塊。使用export方式取出的模塊拷貝不包含版本管理 的相關信息,對該模塊拷貝的修改也不能反映到資源庫。
工作拷貝(working copy):版本管理系統是一個典型的CLIENT/SERVER系統。用戶對資 源的修改不是直接在SERVER端進行的,而是根據資源庫的內容創建一個本地的工作拷貝,用 戶在工作拷貝中工作,工作完成後再將修改的內容提交到資源庫。
簽出(checkout):獲得工作拷貝的操作。此前使用過Visual Source Safe的讀者需注意 ,在Visual Source Safe中的checkout用於鎖定文件。
簽入/提交(checkin/commit):將對工作拷貝的修改反映到資源庫中的操作。在CVS中使 用的術語是提交;在Visual Source Safe中使用的術語是簽入。
更新(update):將資源庫中的最新狀態反映到工作拷貝的操作。
沖突(conflict):在資源庫同工作拷貝之間狀態不一致的狀態下進行簽入或更新操作時 ,版本管理系統可能會盡量進行合並,如果版本管理系統不能完全處理上述不一致,就稱之 為產生了沖突。
快照(snapshot):在某一時刻,模塊中文件狀態(包括文件內容及其版本管理元信息) 的靜態影像。
標簽(tag):由於CVS以文件為版本管理的基本單位,隨著開發的進行,對不同的文件的 修改次數是不一樣的,各個文件的修訂版號會因此而變得參差不齊。這不便於模塊的管理。 為此可以對某個時刻的快照賦予一個標識名稱,標識名稱就被稱為標簽。將來通過標簽就可 以獲得模塊在該時刻的快照。通過標簽所獲得的快照是靜態的,不能被修改。在ECLIPSE中, 標簽與版本(Version)是同義詞,一般都用於文件集合。需要指出的是:在很多中文資料裡 ,修訂版與版本往往不加區分,有時會將單個文件的修訂版也稱為版本。例如,"A文件最新 版本是1.3",這句話中的版本實際上指的是修訂版。因此,需要根據上下文來確定版本的意 義。
分支(branch):分支是一種特殊的標簽。從分支中簽出的資源是可以被修改的。引入分 支是為了更好地支持項目的並行開發過程。
2.2 工作模式
為了解決因多人同時開發而可能產生的沖突問題,版本管理系統有兩種常用的工作模式。
模式一:鎖定-修改-解鎖模式
在這種工作模式中,一個開發人員為了能夠修改文件,首先必須鎖定文件,鎖定文件操作 賦予了開發人員修改文件的權力。從一個文件被鎖定後到其被解鎖前,其他的開發人員不能 再鎖定該文件。這種工作模式適用於小規模的開發小組。如果采用這種工作模式,開發人員 應盡量少、盡可能晚地鎖定文件並盡可能早解鎖文件。模式一是Visual Source Safe的缺省 工作模式。
模式二:拷貝-修改-合並模式
在這種工作模式中,每個開發人員都從資源庫獲得自己的工作拷貝,然後就可以自由的在 工作拷貝中繼續開發,開發完成後再向資源庫提交自己的工作成果。如果在提交時產生了沖 突,則必須在解決沖突後才能再提交。模式二比模式一具有更好的並發性,因而也適用於中 、大規模的開發小組。模式二是CVS所采用的工作模式。
鎖定-修改-解鎖模式是一種悲觀的鎖定模式,它假定在開發過程中可能會產生大量的沖突 ;而拷貝-修改-合並模式則比較樂觀,它假定在開發過程中軟件的設計及開發任務的分配都 比較合理(軟件的模塊化程度高,開發人員一般各司其職),在開發過程中即使會產生沖突 ,但產生沖突的機率比較小。為了更好地使用CVS,我們在使用CVS時也應該遵循它的設計前 提,努力提高軟件的設計水平及項目管理的能力,否則將陷入疲於解決提交沖突的尴尬境地 。
如果想進一步了解CVS的理論知識,請參看文後的參考資料1和參考資料2。
3.環境安裝
LINUX與WINDOWS是目前應用最普及的操作系統。下面首先介紹CVS服務器在兩種操作系統 上的安裝與配置過程,然後介紹如何從ECLIPSE連接CVS服務器,最後介紹如何使用ECLIPSE共 享模塊。無論後台的CVS安裝在何種操作系統之上,對於ECLIPSE來說,與CVS服務器建立了連 接之後其使用方法是一樣的。
3.1 在FEDORA CORE3上安裝、配置CVS
3.1.1 安裝CVS
本文所使用的LINUX發行版為FEDORA CORE3。首先,查看在系統中是否已經安裝了CVS服務 器,如果沒有安裝,則可以從FEDORA CORE3的發行光盤或從網絡上下載相應的軟件包,本文 中使用的軟件包為cvs-1.11.17-7.FC3.i386.rpm。安裝過程如下(在本節中,綠色的為命令 行,緊隨命令行的黑色文本為系統響應):
[root@emulator cvsres]# rpm -ivh cvs-1.11.17-7.FC3.i386.rpm
warning: cvs-1.11.17-7.FC3.i386.rpm: V3 DSA signature: NOKEY, key ID 4f2a6fd2
Preparing... ########################################### [100%]
1:cvs ########################################### [100%]
可以用如下命令查詢系統中是否已經安裝了CVS服務器:
[jiangch@emulator ~]$ rpm -qa | grep cvs
cvs-1.11.17-7.FC3
確認在文件/etc/services中含有以下內容:
cvspserver 2401/tcp # CVS client/server operations
在目錄/etc/xinetd.d中建立一個文件cvspserver,文件內容如下:
service cvspserver
{
socket_type = stream
protocol = tcp
wait = no
user = root
passenv = PATH
server = /usr/bin/cvs
server_args = --allow-root=/home/jiangch/cvsrepo pserver -f
}
其中,--allow-root的值為CVS資源庫的根目錄。如果建立自己的CVS服務器,需要根據實 際情況作相應的修改。
3.1.2 啟動CVS服務
在FEDORA CORE中的CVS服務由xinetd管理,安裝完成後通過下面的命令可以啟動CVS服務 :
[root@emulator cvsres]# /etc/init.d/xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
3.1.3 初始化資源庫
在LINUX中,可以用下面的命令初始化CVS資源庫:
[root@emulator cvsres]# cvs -d /home/jiangch/cvsrepo init
3.1.4 添加CVS用戶
初始化資源庫後,會在CVS資源庫的根目錄下生成一個新的目錄CVSROOT。在目錄中新建一 個名為passwd的文件,為了簡便,文件內容的格式為:
用戶帳號:密碼
每個用戶一行,用戶帳號應在系統中存在。由於密碼必須是加密的,可以從文 件/etc/shadow中提取。這樣CVS用戶將與LIUNX系統用戶具有相同的帳號和密碼。
3.1.5 注意事項
在缺省狀態下LIUNX的安全性比較高,對目錄、文件的讀寫操作有較嚴格的控制。為了在 LINUX下方便的使用CVS,最好建立一個組(group),例如"cvsusers",將CVS的用戶都加 入"cvsusers"中。這樣一來,只要將CVS資源庫根目錄及其所有子目錄(含目錄中的所有文件 )的讀寫權限賦予組"cvsusers",組中的所有用戶都能使用CVS。
3.2 在WINDOWS XP上安裝、配置CVSNT
本文以下的內容都基於WINDOWS XP+CVSNT+ECLIPSE。整個實驗環境包括兩台以WINDOWS XP2為操作系統的計算機,其中一台名為"chjnb"的計算機既作為CVS服務器又安裝了ECLIPSE 作為客戶端,而另一台只安裝了ECLIPSE。CVSNT與ECLIPSE都采用了本文寫作時的最新版本, 分別是CVSNT2.5.03.2151和ECLIPSE3.1.1。ECLIPSE3.1.1可以和CVSNT2.0.58b以上版本很好 的協同工作(見參考資料3)。
CVSNT最初起源於CVS,也是一個開放源碼產品,具有跨平台的能力,可以運行在多種操作 系統之上。WINDOWS版的CVSNT在安裝和使用上都比較方便,對WINDOWS用戶而言具有很強的親 和力。WINDOWS版的CVSNT經過多年的發展,其功能與穩定性得到不斷的加強,完全可以勝任 實際工作中的版本管理任務。而且相對於CVS而言,CVSNT還擴展了不少功能。CVSNT與CVS的 比較請參看參考資料4。
3.2.1 安裝CVSNT
CVSNT可以從以下地址獲得http://www.march-hare.com/cvspro/。在WINDOWS系統上CVSNT 有安裝程序cvsnt-2.5.03.2151.msi(隨版本的不同文件名也不同)。一般采取缺省安裝方式 安裝後,CVSNT即可正常工作,如果想控制安裝過程,則可以選擇定制安裝方式。例如在圖1 、圖2中修改了安裝目錄。
圖1:選擇CVSNT的安裝類型
圖2:修改CVSNT的安裝目錄,選擇CVSNT的可安裝組件
安裝完成後可以通過菜單操作【開始】→【CVSNT】→【CVSNT Control Panel】或控制面 板打開CVSNT的控制管理台。為了使用CVSNT進行版本管理,首先必須建立一個資源庫。在 CVSNT的控制管理台中選擇"Configuration Repository"面板並單擊"Add",出現如圖3所示的 畫面。
圖3:初始化資源庫
在Location中填入資源庫的位置,在Description中填寫該資源庫的說明信息(可以為空 )。值得注意的是當Location包含多級目錄時,Name輸入框中的缺省值不對,需要修改,例 如可以使用最後一級目錄名,如圖3。最後點擊"OK"按鈕,在隨後出現的詢問是否初始化資源 庫的確認對話框中選擇"Yes"即可。
3.2.2 Windows防火牆
如果在安裝有CVS服務器的計算機上使用的是WINDOWS XP2操作系統,並且WINDOWS XP2自 帶的Windows防火牆處於啟用狀態,則不能從其它計算機連接CVS服務器。讀者可以暫時關閉 Windows防火牆或者將CVSNT服務的端口號(2401)添加到Windows防火牆的例外中,其設置步 驟如下:
1.從WINDOWS操作系統的控制面板中雙擊"Windows防火牆"的圖標,出現如圖7所示的畫面 。
圖7:Windows防火牆控制台
2.在圖7中單擊"添加端口"按鈕,請按圖8將CVSNT的服務端口加入防火牆的例外列表。
圖8:將CVSNT的服務端口加入防火牆的例外列表
3.在圖8中按"確定"按鈕就把CVSNT的服務端口加入防火牆的例外列表,見圖9。
圖9:CVSNT的服務端口已被加入到防火牆的例外列表
如果使用了其他的防火牆產品,也應進行相應的設置。
3.2.3 建立CVS用戶
為了在我們的實驗環境中模擬多個用戶,還需要在CVS服務器中建立至少兩個CVS用戶。由 於CVSNT安裝後采用混合認證方式工作,CVS服務器的系統用戶和在CVS本身管理的用戶文件中 定義的用戶都能使用CVSNT服務。為了簡便,本文建立了兩個系統用戶。在WINDOWS XP中可以 通過計算機管理這一工具追加系統用戶,如圖6所示。除了管理員帳號jiangch(我將管理員 Administrator重命名為jiangch),還添加了一個帳戶cvsuser2。
圖6:添加用戶帳號
現在可以在另一台計算機的ECLIPSE中,以cvsuser2為用戶名建立與CVSNT服務器的連接。 至此,我們就建立了一個完整的實驗環境。本文的實驗環境用了兩台計算機,如果計算機的 內存夠大,也可以在一台計算機上建立一個完整的實驗環境。
3.3 建立ECLIPSE與CVS服務器的連接
ECLIPSE可以從http://www.ECLIPSE.org/download下載。ECLIPSE無需安裝,在已安裝JRE 或JDK1.4.2或以上版本的計算機上,只要將下載的文件解壓後即可運行。為了能在ECLIPSE使 用CVS,需要建立ECLIPSE與CVS服務器的連接。其操作步驟如下:
1.打開CVS Repository視圖(Perspective),可以通過如下菜單操作實現:【Window】 →【Open Perspective】→【Other...】。在出現的對話框中選擇CVS Repository Exploring。
2.在CVS Repository視圖中單擊右鍵,選擇【New】→【Repository Location...】(在 ECLIPSE中,如果菜單項的後面有省略號,則表示選擇該菜單項後,將出現對話框供用戶進一 步設定相關信息)。出現如圖4所示對話框。在對話框中填入適當的信息即可。例如,根據圖 中的示范信息,將與我們在前面步驟所安裝的CVSNT服務器建立連接。需注意的是:在Host輸 入框中可以輸入CVS服務器的名字或IP地址;在連接類型下拉框中選擇pserver,這是 CVSNT+ECLIPSE最簡便的配置方式。
圖4:在ECLIPSE中建立與CVSNT服務器的連接
建立連接後,在ECLIPSE的CVS資源庫透視圖中的結果如圖5所示。其中的HEAD表示主分支 (主干)、Branches是分支的集合、Versions是標簽的集合、Dates是用時間做標簽的集合。 由於jiangch是管理員帳戶,因此還顯示了CVSNT的管理文件集合CVSROOT。如果以非管理員帳 戶連接到CVSNT服務器,則看不到上述CVSROOT。
圖5:CVS資源庫視圖
4.模塊的輸入與簽出
4.1 輸入(import)
在正式的項目開發中,輸入模塊通常由CVS管理人員或項目經理完成,一般的開發人員不 需要進行此項工作。在ECLIPSE中,可以將整個項目作為一個模塊導入CVS資源庫。這也是實 際工作中經常采用的工作方式。我們事先在計算機chjnb的ECLIPSE中建立了一個項目 UnitTest,如圖10所示。
圖10:演示用項目的導航器視圖
為了將項目導入CVS資源庫:打開ECLIPSE,選擇希望導入CVS資源庫的項目(project), 點擊右鍵,在出現的彈出菜單中依次選擇【Team】→【Share Project...】,出現圖11。
圖11:共享項目--選擇資源庫
點擊Next按鈕,在下一個對話框中選擇"use project name as a module name",再點擊 Next按鈕,此時,出現如圖12所示的對話框。
圖12:共享項目--控制共享內容
有一些文件,我們不想加入CVS資源庫。例如圖9中的bin目錄,裡面放的是編譯時生成的 class文件。此時,可以在上述對話框的bin目錄上點擊右鍵,在出現的彈出菜單中選擇【Add to cvsignore...】,出現圖13。(注:在preference中也可以進行設定)在圖13中單擊OK按 鈕。
圖13:共享項目--選擇哪類資源不用放入資源庫
隨後單擊圖12中的Finish按鈕,在接下來的一系列對話框中,選擇Yes。隨後出現如圖14 的對話框,在輸入框中輸入注釋,例如:"XXX項目初始化"。 最後單擊OK按鈕。ECLIPSE將向 CVS資源庫中導入代碼模塊。
圖14:共享項目--填寫注釋
模塊導入成功後,java視圖如圖15所示。處於CVS管理狀態的目錄和文件,其圖標的右下 角有一個小圓柱。由於在前面的操作中,我們將bin目錄排除了,因此bin目錄顯示為通常的 圖標。在文件的後面,顯示了該文件的修訂版號,而在目錄的後面則沒有,這是因為CVS系統 版本管理的對象只是文件,而目錄不是CVS版本管理的對象。所有文件的初始修訂版號均為 1.1。輸入成功後,整個項目本身也處於簽出的狀態。
圖15:處於版本管理狀態下的項目視圖
4.2 簽出(checkout)
如果想通過其它計算機上的ECLIPSE獲得工作拷貝,按2.2的操作成功建立連接後,CVS Repository透視圖見圖16。在主分支HEAD下的 UnitTest上點擊右鍵,在出現的彈出菜單中選 擇【Check Out】,這將簽出CVS資源庫中的模塊UnitTest,並在ECLIPSE建立一個名為 UnitTest的新Project。簽出成功後轉到java視圖,會看到一個和圖15類似的界面。
圖16:在CVS資源庫中已經存在一個共享項目UnitTest
在菜單中還有一項【Check Out As...】,通過此菜單項,可以對簽出進行更細致的控制 ,例如,可以更改Project名;可以將簽出的內容追加到已有Project中。
結束語
在本系列的第1部分,介紹了CVS的相關術語及小組開發環境的建立過程。在本系列的第2 部分,將詳細介紹ECLIPSE小組開發環境的使用方法。