Eclipse 2.0中使用版本控制系統CVS

背景

在Visual Age Java之後,IBM推出了新一代的開放源碼軟件開發平臺Eclipse,在此基礎上打造其核心產品WebSphere家族。而對於大部分個人開發者而言,Eclipse作爲一個嶄新的Java集成開發環境提供了一個非常具有吸引力的選擇,已經得到了越來越多開發者的關注和喜愛。

項目的版本控制對於團隊開發是極端重要的,對於個人開發者也是項目複雜化時不可缺少的工具。

在Visual Age Java中,由於Visual Age Java特有的項目數據存儲方式�D�D所有的相關文件都存在一個二進制文件中,可以做到直接內置的版本控制,這一系統也就是著名的ENVY,它在Visual Age Java的使用者中有着非常好的口碑。

而在Eclipse中,情況有了變化。ENVY把項目數據存儲在二進制文件中,也即所謂基於Repository的存儲,而幾乎所有其他集成開發環境的項目數據存儲方式都是基於文件的,項目的所有相關文件直接作爲物理文件存儲在硬盤上。兩種方式各有利弊,有許多剛接觸Visual Age Java的用戶很不習慣ENVY,認爲看不見文件使得自己失去了直接感,反過來也有Visual Age Java的忠實用戶極力支持和讚揚ENVY。(不過作者認爲,在Visual Age Java中開發者至少可以幾乎完全不用花心思在文件路徑問題上,這個問題一般總是會耗費新手甚至老手的大量時間和精力。)在Eclipse中最終使用了基於文件的存儲方式,這樣增強了透明性和互操作性,但是要達到Visual Age Java以前做到的項目管理和源代碼控制就必須採用不同的方式。





回頁首


Eclipse的內置版本支持

Eclipse本身內置了一定程度的版本支持,也就是所謂的Local History。在Eclipse中編輯的文件每次存盤都會留下記錄,可以隨時與歷史記錄比較,恢復到某一個時刻的狀態。在資源視圖(Resource Perspective)或者Java視圖(Java Perspective)中的文件上點右鍵,選擇Compare With,Local History,就會得到如下的畫面,可以很清晰看到各個版本的區別。


圖1:Eclipse中的內置版本支持:Local History。
圖1:Eclipse中的內置版本支持:Local History。

如果需要,則可以通過Replace With,Local History來恢復到任一個以前的版本。當然,這樣版本的歷史是有限制的,可以在Eclipse的Preference中設置。在Preference�D>Workbench->Local History中,可以設置保持最多保持幾天的文件,每一文件的版本數目,歷史文件的大小限制。

但是,這樣的版本系統只實現了最基本的版本功能,如果想把文件某一個狀態標記爲一個版本,加上註釋(僅僅從Local History中的保存時間很難看出每一個版本的特點,也難以找到重要的關鍵版本),或者想把某個目錄乃至整個項目版本化,Eclipse內置的Local History都是無能爲力的。

好在Eclipse基於開放的思想,採用了業界標準的版本控制系統CVS,這樣不僅很好地實現了版本控制的功能,對於已經熟悉CVS的開發者來說也更容易使用,更重要的是,可以爲團隊開發提供更加靈活和開放的選擇:項目的數據可以存儲在一個CVS服務器內,不同的開發者甚至可以採用不同的開發工具,只要這些工具都支持CVS。也許這時我們可以理解爲什麼Eclipse放棄了Visual Age Java的業已很成功的ENVY系統,這一點很好地體現了Eclipse的開放性和對其他軟件的良好互操作性。





回頁首


CVS

CVS是Concurrent Versions System(併發版本系統)的縮寫,基於Unix體系中成熟的SCCS(Source Code Control System)和RCS(Revision Control System)開發,是一個開放源碼的項目,目前已是版本控制系統的主流軟件。一個很常見的使用CVS的場合,就是開放源碼項目。由於開放源碼項目的開發者的分佈性,對於版本管理的要求更加嚴格,而目前大部分的開放源碼項目幾乎都是採用CVS來管理源代碼,CVS的標準性和強大可見一斑。

CVS採用客戶機/服務器體系,代碼以及各種版本存儲在中心服務器內,每一個個體開發者開發時都首先從服務器上獲得一份自己的拷貝,在此基礎上進行開發,以避免直接影響服務器上的數據。開發者可以隨時把自己的新代碼提交給服務器,並通過更新獲得代碼的最新狀態,保持與其他開發者的一致。

CVS對於網絡是透明的,開發者可以使用客戶端軟件(幾乎所有的平臺上都有相應的客戶端軟件)在任何時候,任何地點通過網絡來獲取最新的代碼。

對於Eclipse的開發者而言,Eclipse本身內置了CVS支持,不需要使用其他客戶端軟件,只要建立一個CVS服務器,就可以使用這一強大的版本控制系統了。

CVS起源於Unix/Linux平臺,關於Unix/Linux平臺下的安裝使用的介紹文章很多,這裏就不再重複,讀者如果需要在Unix/Linux平臺下建立CVS服務器,可以參考本文附錄的相關資源。

在Windows平臺上也有CVS的一個實現�D�DCVSNT,CVSNT的安裝有一定困難,這裏我們做一個簡單介紹。 CVSNT的安裝

首先到CVSNT的主頁 http://www.cvsnt.org下載最新版本,目前是CVSNT 1.11.1.3 (Build 57f)。

CVSNT的安裝有一些注意事項,請讀者儘量按照下面所說的步驟來進行安裝,描述主要針對Windows 2000。如果讀者在安裝過程中還有問題,可以參考本文附錄的資源中關於CVSNT的安裝技巧的文章或郵件列表。

  1. CVSNT可以安裝在Windows NT4 服務器或工作站SP6, Windows 2000服務器或專業版,Windows XP專業版上。
  2. 以管理員賬號登陸,首先修改環境變量。直接執行安裝程序,很有可能在最後會出現無法創建路徑變量的錯誤,爲此我們首先修改環境變量,設定路徑。假設我們要把CVSNT安裝到D:/app/cvsnt目錄下(與CVSNT相關的內容最好安裝到NTFS分區上,也儘量不要使用含有空格的目錄名或者文件名,雖然CVSNT已經儘量支持包含空格的目錄名和文件名,但仍有可能出現問題),那麼打開控制面板,系統屬性,高級,環境變量,系統變量中的Path,添加上D:/app/cvsnt並保存設置。
  3. 接下來可以執行安裝程序,修改安裝目錄,一步步完成安裝。
  4. 從開始菜單的程序組中啓動CVSNT配置程序Configure Server。這時應該看到服務器還沒有運行(CVSNT作爲系統服務運行),如果已經運行了,先把它停下來。
  5. 選擇第二個選項卡Repositories,首先勾上Repositories prefix(數據庫路徑前綴)的選項。CVSNT中只有一個數據庫路徑前綴,在這同一個前綴下,可以有多個數據庫。相應的,所有的數據庫都位於數據庫路徑前綴對應的目錄之下。這裏我們假設數據庫都存儲在E:/work/cvsrepo下,點擊省略號按鈕來選擇E:/work/cvsrepo作爲數據庫路徑前綴。
  6. 點擊下面的Add按鈕添加數據庫根,可以有多個。比如我們將/work作爲我們的工作項目的存儲根。注意添加時系統自動把已設定的E:/work/cvsrepo作爲了路徑前綴。
  7. 選擇第三個選項卡Advanced,勾上全部選項,包括Use local users instead of domain。設置臨時目錄,假設爲E:/work/cvstemp。注意要保證臨時目錄的安全設置(右鍵點擊目錄屬性,共享,權限)給所有帳號以完全控制權限,包括SYSTEM帳號。並且,絕對不能把臨時目錄設在諸如C:/WINNT/TEMP或者C:/Documents and Settings下的任何地方,因爲這些地方對於用戶的訪問是有限制的。
  8. 點擊應用以保存設置,這一點相當重要。
  9. 現在可以回到第一個選項卡,點擊Start按鈕,服務應該正常啓動運行了。如果有問題,可以打開一個命令行窗口,輸入path命令來檢查路徑是否已經設置正確,也許需要重新啓動來使設置生效。
  10. 打開一個命令行窗口,輸入如下命令,用你的實際計算機名和用戶名替代尖括號內的內容,注意對於NT Server,不能用localhost作爲計算機名,必須使用實際計算機名: set cvsroot=:ntserver:<計算機名>:/work 這一命令通過設定cvsroot這一環境變量,設定/work爲目前的cvs數據庫根。這裏使用ntserver模式,這一模式比較適合服務器就在本地的情形。它要求局域網或者域內所有機器的用戶帳號相同,客戶端使用Windows NT,Windows 2000或者Windows XP。pserver模式是缺省的,除非關掉2401端口,下面我們的Eclipse就是使用pserver模式。 cvs passwd -a <你的NT用戶名> 這一命令設定CVS中的用戶名和密碼,輸入後將提示你輸入密碼。注意如果需要CVS 服務器同時以ntserver和pserver模式運行,那麼密碼最好不要和系統中用戶的真實密碼相同以保證安全。這裏的用戶必須是服務器上的真實用戶,不過可以給真實用戶設定一個不同的使用名alias。使用命令: cvs passwd -a -r <你的NT用戶名> <CVS帳號別名> 必須注意,這些名字裏最好不要使用任何空格。如果必須的話,可以用雙引號括起來。
  11. 到此爲止,CVS服務器已經初步設置完成,可以使用了。缺省情況下,服務器將作爲NT服務自動運行。讀者既可以使用命令行的CVS命令,也可以使用各種CVS客戶端來連接CVS服務器,執行CVS操作。不過,下面我們主要介紹在Eclipse中通過內置的CVS支持來使用CVS系統。




回頁首


在Eclipse中使用CVS系統

前面已經提到,CVS的數據存放在服務器的數據庫中。爲了支持Concurrent這一併發特點,CVS使用了一個分枝(Branch)模型,以保證不同開發者的相對獨立,但是又高度集成。分枝可以看成一個開發團隊共享的工作區(Workspace),在CVS數據庫中,有一個特殊的分枝稱爲HEAD,代表主要工作流。

開發者可以提交(Commit)自己的工作,並通過更新(Update)與其他人的最新修改保持同步。提交是把自己的修改提交給數據庫,稱爲輸出(Outgoing),更新則是得到其他人的修改,稱爲輸入(Incoming)。每次提交之前,都應該先更新,以保持與最新狀態同步。

因此,在Eclipse中使用CVS進行團隊開發,理想的開發流程應該是這樣的(具體操作方法隨後介紹):


圖2:團隊開發流程
圖2:團隊開發流程
  1. 從最新狀態開始。開始工作前,要保證所有資源與最新的分枝狀態一致。對於從頭開始的新項目,首先要連接服務器,設定存儲那些資源文件。對於在服務器數據庫中已經有記錄的項目,首先要通過更新來保證資源狀態最新。如果本地的工作沒有需要特別保存的,可以直接把數據庫中的最新版本Check Out As Project,或者Replace With,Latest from Repository。
  2. 進行本地工作,保存修改。
  3. 同步。當做好提交工作的準備後,要和服務器數據庫同步。
    1. 首先應該更新(Update),檢查所有的Incoming改變,輸入到本地,看是否會影響自己的工作,是否會造成衝突,破壞完整性等等。
    2. 檢查完更新後,可以確認自己的工作和最新的Branch內容是一致的,就可以提交(Commit)自己的修改了,標上適當的註釋。

下面介紹這一開發流程所用到的主要操作。

對於一個新的項目而言,首先需要做的就是設置Eclipse來連接CVS服務器。首次連接將與服務器同步(Synchronize)。

首先在Eclipse的資源視圖(Resource Perspective)或者Java視圖(Java Perspective)中的項目上點右鍵,選擇Team,Share Project,將出現提示窗口,選擇是使用已知的CVS數據庫位置還是新建數據庫位置。對於第一次連接CVS服務器的情況,將需要首先定義連接所需的服務器參數和路徑,用戶名,密碼等等。這些參數將得到保存,以後如果需要重新連接,就可以直接使用已知的CVS數據庫設置。

這裏我們選擇新建一個數據庫位置,進入下一個輸入畫面。

這裏的主機名(Host)可以輸入localhost(在Windows NT 4下不可以這樣輸入),因爲我們的CVS服務器就在本機上。

接下來輸入/work,設定我們的項目數據存放在這一數據庫根路徑下。

然後輸入用戶名和密碼。

連接類型選擇pserver,端口是缺省的不用改動。當然,如果你修改過CVS服務器使用的端口,這裏就要保持一致。


圖3:在Eclipse中設置使用CVS系統
圖3:在Eclipse中設置使用CVS系統

接下來可以直接點擊Finish完成設置。如果點擊下一步,可以繼續定義在CVS中是否使用與項目名不同的名字作爲模塊名,缺省是使用相同的名字。

現在我們完成了項目與CVS服務器的連接,項目已經和CVS服務器同步了。

但是這並不意味着CVS已經開始記錄版本信息。因爲在一個項目中可能有相當一部分資源文件不適合存儲到數據庫中記錄版本信息,比如編輯器生成的臨時文件,編譯生成的.class文件,或者某些編譯過程生成的二進制文件等等。因此,Eclipse並不自動把所有文件存儲到數據庫中,需要開發者手工指定把那些文件存儲到數據庫中,也就是加入版本控制add to version control。對於單個文件的指定,可以隨時在資源視圖(Resource Perspective)或者Java視圖(Java Perspective)中的文件上使用右鍵,選擇Team,Add to Version Control。如果需要存儲整個項目或者同時指定多個文件,則要使用同步(Synchronize)視圖。

注意項目與CVS服務器連接完成並同步後,在Eclipse右下角的Tasks和Console的位置新出現了一個Synchronize窗口,下方狀態欄也顯示了這次同步的狀態信息。雙擊Synchronize窗口的標題欄使之最大化,我們可以看到窗口上半部分列出了所有尚未指定加入數據庫的資源和文件。在這裏我們可以同時選擇多個文件,甚至選擇整個項目,使用右鍵,選擇Team,Add to Version Control,就可以把多個文件或者整個項目加入到數據庫中,開始記錄其版本信息。

我們可以看到,這時的同步視圖上標明瞭處於Outgoing模式。同步(Synchronize)視圖有Incoming模式和Outgoing模式,對應於提交(Commit)和更新(Update)操作,表示目前修改是來自本地還是來自服務器。當然,視圖也可以同時顯示Incoming和Outgoing方向的變化。當有變化時,在下半部分的比較窗口可以顯示不同版本之間的差異和變化。進一步地,可以通過工具條上的合併(Merge)操作來消除對同一文件不同修改所帶來的衝突。

在此之後,當完成對文件或者項目的修改,需要確認修改,把最新的狀態存儲到數據庫中去,就需要執行提交(commit)操作。類似的,我們可以在資源視圖(Resource Perspective)或者Java視圖(Java Perspective)中的文件上使用右鍵,選擇Team,Commit;或者在同步(Synchronize)視圖中同時提交多個文件乃至整個項目。注意,每次提交時都會提示輸入註釋,這是很重要的,作爲每一個狀態的說明和提示。

當我們需要把文件或者項目的不同版本進行比較或者替換時,可以在資源視圖(Resource Perspective)或者Java視圖(Java Perspective)中的文件上使用右鍵,選擇Team,Compare With或者Team,Replace With來完成。進行比較時將打開一個比較編輯器,很好地表示不同版本之間的差異,和Local History類似。

如果要了解CVS數據庫的內容情況,可以使用CVS數據庫瀏覽視圖(CVS Repository Exploring Perspective)。我們可以點擊Eclipse左上角的開啓視圖(Open Perspective)按鈕,增加這一視圖到左邊的視圖瀏覽欄裏。前面已經提到,HEAD代表CVS數據庫裏的主流內容。展開Versions,可以看到以往的版本。另外,在右下角有數據庫的歷史記錄標明每次修改的相關信息。

如果需要導出某一版本,就要用到Check Out操作。在某一版本上右鍵選擇Check Out As Project,這將把這一版本導出爲同名的項目,從而可以覆蓋已有的狀態,或者選擇Check Out對話框來導出爲其他項目。


圖4:CVS數據庫瀏覽視圖
圖4:CVS數據庫瀏覽視圖

關於更詳細的CVS使用方法和技巧,可以參考Eclipse的幫助中相關內容。



參考資料

關於CVS:

http://www.cvshome.org,CVS官方網站,可以從這裏下載最新版本的CVS(Unix/Linux平臺版本)以及相關的文檔和資料,例如Per Cederqvist的Version Management with CVS 這本官方手冊。

http://www.cvsnt.org,CVSNT,在Windows NT上的CVS服務器,在此基礎上也有返回Unix/Linux平臺的版本。目前最新版本是CVSNT 1.11.1.3 (Build 57f)。

http://www.cvsnt.org/mailman/listinfo/cvsnt,關於CVSNT的使用問題的郵件列表。

http://w1.858.telia.com/~u85831169/InstallCVSNT.html,關於CVSNT安裝的一些技巧和知識,感謝作者慷慨的准許,本文參考了其中部分內容。

http://devguy.com/cvsnt,另一個CVSNT安裝問題的幫助和常見問題回答。

http://www.cvsgui.org,Windows平臺下的圖形化CVS客戶端軟件。  

發佈了24 篇原創文章 · 獲贊 3 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章