在Eclipse 2.0中使用版本控制系统CVS
2002 年 7 月
?
2002年6月28日,Eclipse 2.0正式版已經(jīng)正式完成,這將是Java開發(fā)工具歷史上的一個重要事件,Eclipse開始步入成熟階段。本文借此機(jī)會介紹在Eclipse中使用版本控制系統(tǒng)CVS的一些經(jīng)驗(yàn)和技巧。首先介紹為什么Eclipse要使用CVS來作為自己的版本控制系統(tǒng)而放棄了有著很好口碑的Visual Age Java的ENVY,然后簡要講述CVS系統(tǒng)的背景及NT平臺下CVS服務(wù)器的安裝和設(shè)置。接下來,針對Eclipse,詳細(xì)講解了使用CVS進(jìn)行團(tuán)隊(duì)開發(fā)時的開發(fā)流程以及在Eclipse中具體使用的重要操作方法。
背景
在Visual Age Java之后,IBM推出了新一代的開放源碼軟件開發(fā)平臺Eclipse,在此基礎(chǔ)上打造其核心產(chǎn)品WebSphere家族。而對于大部分個人開發(fā)者而言,Eclipse作為一個嶄新的Java集成開發(fā)環(huán)境提供了一個非常具有吸引力的選擇,已經(jīng)得到了越來越多開發(fā)者的關(guān)注和喜愛。
項(xiàng)目的版本控制對于團(tuán)隊(duì)開發(fā)是極端重要的,對于個人開發(fā)者也是項(xiàng)目復(fù)雜化時不可缺少的工具。
在Visual Age Java中,由于Visual Age Java特有的項(xiàng)目數(shù)據(jù)存儲方式――所有的相關(guān)文件都存在一個二進(jìn)制文件中,可以做到直接內(nèi)置的版本控制,這一系統(tǒng)也就是著名的ENVY,它在Visual Age Java的使用者中有著非常好的口碑。
而在Eclipse中,情況有了變化。ENVY把項(xiàng)目數(shù)據(jù)存儲在二進(jìn)制文件中,也即所謂基于Repository的存儲,而幾乎所有其他集成開發(fā)環(huán)境的項(xiàng)目數(shù)據(jù)存儲方式都是基于文件的,項(xiàng)目的所有相關(guān)文件直接作為物理文件存儲在硬盤上。兩種方式各有利弊,有許多剛接觸Visual Age Java的用戶很不習(xí)慣ENVY,認(rèn)為看不見文件使得自己失去了直接感,反過來也有Visual Age Java的忠實(shí)用戶極力支持和贊揚(yáng)ENVY。(不過作者認(rèn)為,在Visual Age Java中開發(fā)者至少可以幾乎完全不用花心思在文件路徑問題上,這個問題一般總是會耗費(fèi)新手甚至老手的大量時間和精力。)在Eclipse中最終使用了基于文件的存儲方式,這樣增強(qiáng)了透明性和互操作性,但是要達(dá)到Visual Age Java以前做到的項(xiàng)目管理和源代碼控制就必須采用不同的方式。
Eclipse的內(nèi)置版本支持
Eclipse本身內(nèi)置了一定程度的版本支持,也就是所謂的Local History。在Eclipse中編輯的文件每次存盤都會留下記錄,可以隨時與歷史記錄比較,恢復(fù)到某一個時刻的狀態(tài)。在資源視圖(Resource Perspective)或者Java視圖(Java Perspective)中的文件上點(diǎn)右鍵,選擇Compare With,Local History,就會得到如下的畫面,可以很清晰看到各個版本的區(qū)別。
圖1:Eclipse中的內(nèi)置版本支持:Local History。
如果需要,則可以通過Replace With,Local History來恢復(fù)到任一個以前的版本。當(dāng)然,這樣版本的歷史是有限制的,可以在Eclipse的Preference中設(shè)置。在Preference―>Workbench->Local History中,可以設(shè)置保持最多保持幾天的文件,每一文件的版本數(shù)目,歷史文件的大小限制。
但是,這樣的版本系統(tǒng)只實(shí)現(xiàn)了最基本的版本功能,如果想把文件某一個狀態(tài)標(biāo)記為一個版本,加上注釋(僅僅從Local History中的保存時間很難看出每一個版本的特點(diǎn),也難以找到重要的關(guān)鍵版本),或者想把某個目錄乃至整個項(xiàng)目版本化,Eclipse內(nèi)置的Local History都是無能為力的。
好在Eclipse基于開放的思想,采用了業(yè)界標(biāo)準(zhǔn)的版本控制系統(tǒng)CVS,這樣不僅很好地實(shí)現(xiàn)了版本控制的功能,對于已經(jīng)熟悉CVS的開發(fā)者來說也更容易使用,更重要的是,可以為團(tuán)隊(duì)開發(fā)提供更加靈活和開放的選擇:項(xiàng)目的數(shù)據(jù)可以存儲在一個CVS服務(wù)器內(nèi),不同的開發(fā)者甚至可以采用不同的開發(fā)工具,只要這些工具都支持CVS。也許這時我們可以理解為什么Eclipse放棄了Visual Age Java的業(yè)已很成功的ENVY系統(tǒng),這一點(diǎn)很好地體現(xiàn)了Eclipse的開放性和對其他軟件的良好互操作性。
CVS
CVS是Concurrent Versions System(并發(fā)版本系統(tǒng))的縮寫,基于Unix體系中成熟的SCCS(Source Code Control System)和RCS(Revision Control System)開發(fā),是一個開放源碼的項(xiàng)目,目前已是版本控制系統(tǒng)的主流軟件。一個很常見的使用CVS的場合,就是開放源碼項(xiàng)目。由于開放源碼項(xiàng)目的開發(fā)者的分布性,對于版本管理的要求更加嚴(yán)格,而目前大部分的開放源碼項(xiàng)目幾乎都是采用CVS來管理源代碼,CVS的標(biāo)準(zhǔn)性和強(qiáng)大可見一斑。
CVS采用客戶機(jī)/服務(wù)器體系,代碼以及各種版本存儲在中心服務(wù)器內(nèi),每一個個體開發(fā)者開發(fā)時都首先從服務(wù)器上獲得一份自己的拷貝,在此基礎(chǔ)上進(jìn)行開發(fā),以避免直接影響服務(wù)器上的數(shù)據(jù)。開發(fā)者可以隨時把自己的新代碼提交給服務(wù)器,并通過更新獲得代碼的最新狀態(tài),保持與其他開發(fā)者的一致。
CVS對于網(wǎng)絡(luò)是透明的,開發(fā)者可以使用客戶端軟件(幾乎所有的平臺上都有相應(yīng)的客戶端軟件)在任何時候,任何地點(diǎn)通過網(wǎng)絡(luò)來獲取最新的代碼。
對于Eclipse的開發(fā)者而言,Eclipse本身內(nèi)置了CVS支持,不需要使用其他客戶端軟件,只要建立一個CVS服務(wù)器,就可以使用這一強(qiáng)大的版本控制系統(tǒng)了。
CVS起源于Unix/Linux平臺,關(guān)于Unix/Linux平臺下的安裝使用的介紹文章很多,這里就不再重復(fù),讀者如果需要在Unix/Linux平臺下建立CVS服務(wù)器,可以參考本文附錄的相關(guān)資源。
在Windows平臺上也有CVS的一個實(shí)現(xiàn)――CVSNT,CVSNT的安裝有一定困難,這里我們做一個簡單介紹。 CVSNT的安裝
首先到CVSNT的主頁http://www.cvsnt.org下載最新版本,目前是CVSNT 1.11.1.3 (Build 57f)。
CVSNT的安裝有一些注意事項(xiàng),請讀者盡量按照下面所說的步驟來進(jìn)行安裝,描述主要針對Windows 2000。如果讀者在安裝過程中還有問題,可以參考本文附錄的資源中關(guān)于CVSNT的安裝技巧的文章或郵件列表。
CVSNT可以安裝在Windows NT4 服務(wù)器或工作站SP6, Windows 2000服務(wù)器或?qū)I(yè)版,Windows XP專業(yè)版上。
以管理員賬號登陸,首先修改環(huán)境變量。直接執(zhí)行安裝程序,很有可能在最后會出現(xiàn)無法創(chuàng)建路徑變量的錯誤,為此我們首先修改環(huán)境變量,設(shè)定路徑。假設(shè)我們要把CVSNT安裝到D:\app\cvsnt目錄下(與CVSNT相關(guān)的內(nèi)容最好安裝到NTFS分區(qū)上,也盡量不要使用含有空格的目錄名或者文件名,雖然CVSNT已經(jīng)盡量支持包含空格的目錄名和文件名,但仍有可能出現(xiàn)問題),那么打開控制面板,系統(tǒng)屬性,高級,環(huán)境變量,系統(tǒng)變量中的Path,添加上D:\app\cvsnt并保存設(shè)置。
接下來可以執(zhí)行安裝程序,修改安裝目錄,一步步完成安裝。
從開始菜單的程序組中啟動CVSNT配置程序Configure Server。這時應(yīng)該看到服務(wù)器還沒有運(yùn)行(CVSNT作為系統(tǒng)服務(wù)運(yùn)行),如果已經(jīng)運(yùn)行了,先把它停下來。
選擇第二個選項(xiàng)卡Repositories,首先勾上Repositories prefix(數(shù)據(jù)庫路徑前綴)的選項(xiàng)。CVSNT中只有一個數(shù)據(jù)庫路徑前綴,在這同一個前綴下,可以有多個數(shù)據(jù)庫。相應(yīng)的,所有的數(shù)據(jù)庫都位于數(shù)據(jù)庫路徑前綴對應(yīng)的目錄之下。這里我們假設(shè)數(shù)據(jù)庫都存儲在E:\work\cvsrepo下,點(diǎn)擊省略號按鈕來選擇E:\work\cvsrepo作為數(shù)據(jù)庫路徑前綴。
點(diǎn)擊下面的Add按鈕添加數(shù)據(jù)庫根,可以有多個。比如我們將/work作為我們的工作項(xiàng)目的存儲根。注意添加時系統(tǒng)自動把已設(shè)定的E:\work\cvsrepo作為了路徑前綴。
選擇第三個選項(xiàng)卡Advanced,勾上全部選項(xiàng),包括Use local users instead of domain。設(shè)置臨時目錄,假設(shè)為E:\work\cvstemp。注意要保證臨時目錄的安全設(shè)置(右鍵點(diǎn)擊目錄屬性,共享,權(quán)限)給所有帳號以完全控制權(quán)限,包括SYSTEM帳號。并且,絕對不能把臨時目錄設(shè)在諸如C:\WINNT\TEMP或者C:\Documents and Settings下的任何地方,因?yàn)檫@些地方對于用戶的訪問是有限制的。
點(diǎn)擊應(yīng)用以保存設(shè)置,這一點(diǎn)相當(dāng)重要。
現(xiàn)在可以回到第一個選項(xiàng)卡,點(diǎn)擊Start按鈕,服務(wù)應(yīng)該正常啟動運(yùn)行了。如果有問題,可以打開一個命令行窗口,輸入path命令來檢查路徑是否已經(jīng)設(shè)置正確,也許需要重新啟動來使設(shè)置生效。
打開一個命令行窗口,輸入如下命令,用你的實(shí)際計(jì)算機(jī)名和用戶名替代尖括號內(nèi)的內(nèi)容,注意對于NT Server,不能用localhost作為計(jì)算機(jī)名,必須使用實(shí)際計(jì)算機(jī)名:
set cvsroot=:ntserver:<計(jì)算機(jī)名>:/work
這一命令通過設(shè)定cvsroot這一環(huán)境變量,設(shè)定/work為目前的cvs數(shù)據(jù)庫根。這里使用ntserver模式,這一模式比較適合服務(wù)器就在本地的情形。它要求局域網(wǎng)或者域內(nèi)所有機(jī)器的用戶帳號相同,客戶端使用Windows NT,Windows 2000或者Windows XP。pserver模式是缺省的,除非關(guān)掉2401端口,下面我們的Eclipse就是使用pserver模式。
cvs passwd -a <你的NT用戶名>
這一命令設(shè)定CVS中的用戶名和密碼,輸入后將提示你輸入密碼。
注意如果需要CVS 服務(wù)器同時以ntserver和pserver模式運(yùn)行,那么密碼最好不要和系統(tǒng)中用戶的真實(shí)密碼相同以保證安全。
這里的用戶必須是服務(wù)器上的真實(shí)用戶,不過可以給真實(shí)用戶設(shè)定一個不同的使用名alias。使用命令:
cvs passwd -a -r <你的NT用戶名> <CVS帳號別名>
必須注意,這些名字里最好不要使用任何空格。如果必須的話,可以用雙引號括起來。
到此為止,CVS服務(wù)器已經(jīng)初步設(shè)置完成,可以使用了。缺省情況下,服務(wù)器將作為NT服務(wù)自動運(yùn)行。讀者既可以使用命令行的CVS命令,也可以使用各種CVS客戶端來連接CVS服務(wù)器,執(zhí)行CVS操作。不過,下面我們主要介紹在Eclipse中通過內(nèi)置的CVS支持來使用CVS系統(tǒng)。
在Eclipse中使用CVS系統(tǒng)
前面已經(jīng)提到,CVS的數(shù)據(jù)存放在服務(wù)器的數(shù)據(jù)庫中。為了支持Concurrent這一并發(fā)特點(diǎn),CVS使用了一個分枝(Branch)模型,以保證不同開發(fā)者的相對獨(dú)立,但是又高度集成。分枝可以看成一個開發(fā)團(tuán)隊(duì)共享的工作區(qū)(Workspace),在CVS數(shù)據(jù)庫中,有一個特殊的分枝稱為HEAD,代表主要工作流。
開發(fā)者可以提交(Commit)自己的工作,并通過更新(Update)與其他人的最新修改保持同步。提交是把自己的修改提交給數(shù)據(jù)庫,稱為輸出(Outgoing),更新則是得到其他人的修改,稱為輸入(Incoming)。每次提交之前,都應(yīng)該先更新,以保持與最新狀態(tài)同步。
因此,在Eclipse中使用CVS進(jìn)行團(tuán)隊(duì)開發(fā),理想的開發(fā)流程應(yīng)該是這樣的(具體操作方法隨后介紹):
圖2:團(tuán)隊(duì)開發(fā)流程
1.從最新狀態(tài)開始。開始工作前,要保證所有資源與最新的分枝狀態(tài)一致。對于從頭開始的新項(xiàng)目,首先要連接服務(wù)器,設(shè)定存儲那些資源文件。對于在服務(wù)器數(shù)據(jù)庫中已經(jīng)有記錄的項(xiàng)目,首先要通過更新來保證資源狀態(tài)最新。如果本地的工作沒有需要特別保存的,可以直接把數(shù)據(jù)庫中的最新版本Check Out As Project,或者Replace With,Latest from Repository。
2.進(jìn)行本地工作,保存修改。
3.同步。當(dāng)做好提交工作的準(zhǔn)備后,要和服務(wù)器數(shù)據(jù)庫同步。
(1)首先應(yīng)該更新(Update),檢查所有的Incoming改變,輸入到本地,看是否會影響自己的工作,是否會造成沖突,破壞完整性等等。
(2)檢查完更新后,可以確認(rèn)自己的工作和最新的Branch內(nèi)容是一致的,就可以提交(Commit)自己的修改了,標(biāo)上適當(dāng)?shù)淖⑨尅?
下面介紹這一開發(fā)流程所用到的主要操作。
對于一個新的項(xiàng)目而言,首先需要做的就是設(shè)置Eclipse來連接CVS服務(wù)器。首次連接將與服務(wù)器同步(Synchronize)。
首先在Eclipse的資源視圖(Resource Perspective)或者Java視圖(Java Perspective)中的項(xiàng)目上點(diǎn)右鍵,選擇Team,Share Project,將出現(xiàn)提示窗口,選擇是使用已知的CVS數(shù)據(jù)庫位置還是新建數(shù)據(jù)庫位置。對于第一次連接CVS服務(wù)器的情況,將需要首先定義連接所需的服務(wù)器參數(shù)和路徑,用戶名,密碼等等。這些參數(shù)將得到保存,以后如果需要重新連接,就可以直接使用已知的CVS數(shù)據(jù)庫設(shè)置。
這里我們選擇新建一個數(shù)據(jù)庫位置,進(jìn)入下一個輸入畫面。
這里的主機(jī)名(Host)可以輸入localhost(在Windows NT 4下不可以這樣輸入),因?yàn)槲覀兊腃VS服務(wù)器就在本機(jī)上。
接下來輸入/work,設(shè)定我們的項(xiàng)目數(shù)據(jù)存放在這一數(shù)據(jù)庫根路徑下。
然后輸入用戶名和密碼。
連接類型選擇pserver,端口是缺省的不用改動。當(dāng)然,如果你修改過CVS服務(wù)器使用的端口,這里就要保持一致。
圖3:在Eclipse中設(shè)置使用CVS系統(tǒng)
接下來可以直接點(diǎn)擊Finish完成設(shè)置。如果點(diǎn)擊下一步,可以繼續(xù)定義在CVS中是否使用與項(xiàng)目名不同的名字作為模塊名,缺省是使用相同的名字。
現(xiàn)在我們完成了項(xiàng)目與CVS服務(wù)器的連接,項(xiàng)目已經(jīng)和CVS服務(wù)器同步了。
但是這并不意味著CVS已經(jīng)開始記錄版本信息。因?yàn)樵谝粋€項(xiàng)目中可能有相當(dāng)一部分資源文件不適合存儲到數(shù)據(jù)庫中記錄版本信息,比如編輯器生成的臨時文件,編譯生成的.class文件,或者某些編譯過程生成的二進(jìn)制文件等等。因此,Eclipse并不自動把所有文件存儲到數(shù)據(jù)庫中,需要開發(fā)者手工指定把那些文件存儲到數(shù)據(jù)庫中,也就是加入版本控制add to version control。對于單個文件的指定,可以隨時在資源視圖(Resource Perspective)或者Java視圖(Java Perspective)中的文件上使用右鍵,選擇Team,Add to Version Control。如果需要存儲整個項(xiàng)目或者同時指定多個文件,則要使用同步(Synchronize)視圖。
注意項(xiàng)目與CVS服務(wù)器連接完成并同步后,在Eclipse右下角的Tasks和Console的位置新出現(xiàn)了一個Synchronize窗口,下方狀態(tài)欄也顯示了這次同步的狀態(tài)信息。雙擊Synchronize窗口的標(biāo)題欄使之最大化,我們可以看到窗口上半部分列出了所有尚未指定加入數(shù)據(jù)庫的資源和文件。在這里我們可以同時選擇多個文件,甚至選擇整個項(xiàng)目,使用右鍵,選擇Team,Add to Version Control,就可以把多個文件或者整個項(xiàng)目加入到數(shù)據(jù)庫中,開始記錄其版本信息。
我們可以看到,這時的同步視圖上標(biāo)明了處于Outgoing模式。同步(Synchronize)視圖有Incoming模式和Outgoing模式,對應(yīng)于提交(Commit)和更新(Update)操作,表示目前修改是來自本地還是來自服務(wù)器。當(dāng)然,視圖也可以同時顯示Incoming和Outgoing方向的變化。當(dāng)有變化時,在下半部分的比較窗口可以顯示不同版本之間的差異和變化。進(jìn)一步地,可以通過工具條上的合并(Merge)操作來消除對同一文件不同修改所帶來的沖突。
在此之后,當(dāng)完成對文件或者項(xiàng)目的修改,需要確認(rèn)修改,把最新的狀態(tài)存儲到數(shù)據(jù)庫中去,就需要執(zhí)行提交(commit)操作。類似的,我們可以在資源視圖(Resource Perspective)或者Java視圖(Java Perspective)中的文件上使用右鍵,選擇Team,Commit;或者在同步(Synchronize)視圖中同時提交多個文件乃至整個項(xiàng)目。注意,每次提交時都會提示輸入注釋,這是很重要的,作為每一個狀態(tài)的說明和提示。
當(dāng)我們需要把文件或者項(xiàng)目的不同版本進(jìn)行比較或者替換時,可以在資源視圖(Resource Perspective)或者Java視圖(Java Perspective)中的文件上使用右鍵,選擇Team,Compare With或者Team,Replace With來完成。進(jìn)行比較時將打開一個比較編輯器,很好地表示不同版本之間的差異,和Local History類似。
如果要了解CVS數(shù)據(jù)庫的內(nèi)容情況,可以使用CVS數(shù)據(jù)庫瀏覽視圖(CVS Repository Exploring Perspective)。我們可以點(diǎn)擊Eclipse左上角的開啟視圖(Open Perspective)按鈕,增加這一視圖到左邊的視圖瀏覽欄里。前面已經(jīng)提到,HEAD代表CVS數(shù)據(jù)庫里的主流內(nèi)容。展開Versions,可以看到以往的版本。另外,在右下角有數(shù)據(jù)庫的歷史記錄標(biāo)明每次修改的相關(guān)信息。
如果需要導(dǎo)出某一版本,就要用到Check Out操作。在某一版本上右鍵選擇Check Out As Project,這將把這一版本導(dǎo)出為同名的項(xiàng)目,從而可以覆蓋已有的狀態(tài),或者選擇Check Out對話框來導(dǎo)出為其他項(xiàng)目。
圖4:CVS數(shù)據(jù)庫瀏覽視圖
關(guān)于更詳細(xì)的CVS使用方法和技巧,可以參考Eclipse的幫助中相關(guān)內(nèi)容。
關(guān)于作者:
董向輝,1998年畢業(yè)于清華大學(xué),隨后進(jìn)入中科院自動化所人工智能實(shí)驗(yàn)室直接攻博。科研興趣主要在演化計(jì)算和系統(tǒng)復(fù)雜性問題,技術(shù)方面,從接觸Java開始,便一直保持著對Java的興趣并作為主要編程語言。同時注意關(guān)心新出現(xiàn)的有前景的相關(guān)技術(shù),聚焦點(diǎn)先后包括軟件工程,XML,J2ME等等。電子郵件地址:xianghui.dong@mail.ia.ac.cn。
相關(guān)資源:
關(guān)于CVS:
http://www.cvshome.org,CVS官方網(wǎng)站,可以從這里下載最新版本的CVS(Unix/Linux平臺版本)以及相關(guān)的文檔和資料,例如Per Cederqvist的Version Management with CVS 這本官方手冊。
http://laser.zhengmai.com.cn/cvstutorials.html,一個中文的CVS簡單教程。
http://www.cvsnt.org,CVSNT,在Windows NT上的CVS服務(wù)器,在此基礎(chǔ)上也有返回Unix/Linux平臺的版本。目前最新版本是CVSNT 1.11.1.3 (Build 57f)。
http://www.cvsnt.org/mailman/listinfo/cvsnt,關(guān)于CVSNT的使用問題的郵件列表。
http://w1.858.telia.com/~u85831169/InstallCVSNT.html,關(guān)于CVSNT安裝的一些技巧和知識,感謝作者慷慨的準(zhǔn)許,本文參考了其中部分內(nèi)容。
http://devguy.com/cvsnt,另一個CVSNT安裝問題的幫助和常見問題回答。
http://www.cvsgui.org,Windows平臺下的圖形化CVS客戶端軟件。
關(guān)于Eclipse:
http://www.eclipse.org,Eclipse官方網(wǎng)站,可以從這里下載最新版本2.0。
http://www-900.ibm.com/developerWorks/cn/java/l-ide/part2/index.shtml,VAJ之后是什么?,介紹從Visual Age Java到Eclipse,WSWB等等的來龍去脈以及各自的特點(diǎn)。
http://dev.eclipse.org/viewcvs/index.cgi/~checkout~/platform-vcm-home/docs/online/cvs_features2.0/cvs-faq.html,在Eclipse中使用CVS的常見問題回答。更詳細(xì)的具體操作介紹,可以參考Eclipse軟件所附帶的幫助。
總結(jié)
以上是生活随笔為你收集整理的在Eclipse 2.0中使用版本控制系统CVS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET 2.0+Atlas编写鼠
- 下一篇: Windows服务器安全设置经验详谈