天天看點

Eclipse下使用SVN版本控制

摘要 CVS很酷,但Subversion更酷。然而,如果你在使用Eclipse進行開發,那麼你可能直到近來才能利用Subversion帶來的優點。随着 Subclipse的發行,Subversion可能會最終在你的Eclipse IDE環境充分發揮其威力而壓倒CVS。

一、SCM和Subversion簡介  軟體配置管理(SCM)是管理源碼并保持其安全的良好藝術,它能實作源碼與其他團隊成員之間保持共享,并且能夠對之加以保護。良好地利用SCM,你能夠容易地跟蹤軟體的發行和新的開發分支;這樣以來,可以更為容易地辨別和修正發行産品中的錯誤。

其實,有大量的SCM工具可用,既有開源的和也有商業化的,例如StarTeam,Perforce,BitKeeper和ClearCase。在開源 世界裡,事實上的SCM标準是并發版本管理系統(CVS),它被廣泛應用于世界範圍内的成百上千的開源和商業工程。然而,CVS也存在下列許多固有的缺 陷,這使得它無法非常完美地适合于現代工程開發:

· 實質上針對文本檔案的設計使得CVS處理二進制檔案能力比較差。在每一次送出時,二進制檔案被以整體形式傳輸和存儲,這将帶來帶寬和磁盤空間的浪費。

· 在CVS中,你不能移動檔案和目錄。你唯一的選擇基本上就是删除并且重新添加它們,進而失去了整個過程中的所有的檔案曆史資訊。

· CVS中沒有實作原子送出的概念。比方說,你要把10個檔案送出到伺服器,而該送出操作往往在整個過程的中途停了下來。(這很可能會發生,如果某人同時提 交一個檔案,或甚至如果你的網絡失敗或你的PC重新啟動的話。)在這種情況下,伺服器将僅記錄下你的修正的一半資訊,這可能會使代碼基部分處于一種潛在地 不穩定的狀态。

Subversion是一種比較新的開源SCM工具,其設計目的是力圖從根本上克服原CVS所具有的限制。它是一種良好設計的工具,具有适合于現代開發的許多新特征:

· 送出是原子化的。送出的檔案都能夠被正确加入到一個新的修訂當中,否則倉庫不會被更新;并且每一個新的修訂僅由一次送出中的變化部分組成。

· Subversion對文本和二進制檔案使用一種巧妙的二進制技術,這既優化了網絡流量也優化了倉庫磁盤空間。

· 在Subversion中,每一次修訂都代表了一個特定時間内完整的目錄樹拷貝。檔案和目錄可以不加限制地進行移動。

· Subversion僅存儲兩個版本之間的修改内容,這不僅節約了磁盤空間,并且意味着辨別一個新版本或建立一種新的子内容幾乎可以立即實作。

· 你可以以多種途徑來存取一個Subversion倉庫,具體則依賴于你的需要:使用HTTP或HTTPS(與WebDAV一起使用),使用快速的專利性svn:協定,或直接經由本地檔案,等等。 

二、Subclipse插件與Eclipse的內建

一種良好的SCM應該與你的工作環境緊密地內建到一起。沒有誰真正喜歡轉到指令行以把檔案添加到倉庫。Eclipse很早就實作了CVS內建,但是直到 最近Subversion使用者仍沒有被引起重視。現在,新的Subclipse插件提供了在Eclipse中的一種平滑的Subversion內建。

(一) 安裝Subclipse插件

下面,你以通常的方法從更新站點下安裝Subclipse:

1. 打開"Find and install"視窗("Help>Software Updates>Find and Install")。

2. 選擇"Search for new features to install"選項并點選Next。

3. 點選"New Remote Site"并且建立一遠端站點,使用名字Subclipse和URL [url]http://subclipse.tigris.org/update_1.0.x[/url](參考圖1)。

4. 在結果安裝視窗中,把"Subeclipse in the Features"選擇到安裝清單中,并且通過向導來開始安裝插件。

5. 完成這些之後,重新啟動Eclipse。現在,你可以繼續往下進行!

<col>

圖1.安裝Subclipse插件

(二) 建立Repository定義

現在,既然你已經安裝完插件;那麼,接下來,你需要告訴它你的工程倉庫位于何處。你是在SVN Repository視圖中實作的。打開這個視圖("Windows&gt;Show View&gt;Other&gt;SVN Repository")并且在上下文菜單中選擇"New&gt;Repository Location"以顯示一個如圖2所示的對話框。輸入适當的URL并且點選"Finish"。

圖2.添加一個倉庫定義

(三) 檢出(Check Out)一個工程

一旦建立一個倉庫,你就可以在SVN Repository視圖中浏覽所有的内容(見圖3)。我們後面将會看到,這個視圖是一種與Subversion進行互動的非常友善的方式。

圖3.SVN Repository視圖。

現在,讓我們把一個工程檢出到你的Eclipse工作區中。這隻需選擇你需要的Subversion倉庫,打開上下文菜單,并且選擇"Checkout"即可。這将打開一個具有兩個選項的向導:

· Check out as a Project configured using the New Project Wizard-這個選項打開新工程向導,這可以讓你使用内建的Eclipse工程類型配置工程。這個選項通常是最好用的,因為它讓你使用相同的工程模闆和 配置螢幕,而當你建立一個正常工程時你經常使用它們。

· Check out as a Project in the Workspace-這個選項簡單地在你的包含檢出源碼的工作區中建立一個Eclipse工程。

在以上兩種情況下,你仍然需要更新工程的建構路徑,因為在檢出該工程源碼之前,Eclipse不能确定這些​​Java​​源碼所在的位置。

(四) 把一個新工程導入到倉庫中

如果你隻是啟動了一個新的工程,那麼你需要把它導入到Subversion倉庫。Subclipse提供了一種友善的方式來直接從你的IDE内部實作這 一點。為此,隻需要從Package Explorer視圖下選擇你的工程,并且在上下文菜單中選擇"Team&gt;Share Project"。你可以使用現有倉庫之一或建立一新的倉庫定義。在你指定倉庫和工程名之後,你能指定你想放到倉庫中的檔案和目錄并且提供一個初始注釋 (見圖4)。這種方法特别有用,因為它讓你有選擇地導入僅由Subversion管理的檔案,即使該工程還包含其它檔案(例如生成的類,臨時檔案或其它不 是必需的内容等)。

圖4.把一個工程導入到一個Subversion倉庫中

三、在Eclipse中使用Subversion   現在,既然你的支援Subversion的工程已經啟動并且運作起來,那麼大多數必要的Subversion指令就可經由"Team"上下文菜單存取 (參考圖5)。你可以在Package Explorer中看到你的本地檔案的狀态(參考圖6),其中,任何修改了的檔案都被标記上一個星号。存儲在倉庫中的檔案都顯示一個小黃桶圖示(代表了一 個資料庫);還沒有被添加到倉庫中的檔案以一個問号顯示。

圖5.大多數Subversion指令能被經由Team菜單存取

圖6.你可以在Package Explorer中看到本地檔案的狀态

(一) 與Repository保持同步

從倉庫中更新你的檔案并且把你的變化送出到倉庫是相當直接的過程,這可以使用"Team&gt;Update and Team&gt;Commit"菜單選項來實作。在送出你的變化之前,你可能想看一下自從你的上次更新以來是否伺服器上有任何檔案被修改。為此,你可以使 用"Team &gt;Synchronize with Repository"。這個指令讓你看到有哪些内容已經被局部地修改,有哪些内容在伺服器上修改,以及這兩種修改之間的任何沖突(參考圖7)。你還可以 以可視化方式看到沖突的版本,并且在送出你的變化之前糾正任何比較突出的沖突。

圖7.與倉庫保持同步

(二) 使用屬性

屬性是Subversion具有創新性的特征之一。在Subversion中,你可以把中繼資料("properties")關聯到任何檔案或目錄。你可以定義任何你喜歡的屬性,但是Subversion也提供了一些有用的内置屬性,例如下面圖8中所提供的這些屬性:

· svn:executable屬性,允許你在支援這種能力的作業系統上設定一個檔案的可執行标志。

· svn:need-lock屬性,可以用來在檔案(例如,對二進制檔案非常有用)上強加排斥鎖。一個定義了svn:need-lock屬性的檔案一次隻能 被一個人修改。當該檔案被檢出時,它是隻讀的。如果你想修改該檔案,你需要首先使用"Team&gt;Lock"菜單選項。之後,使用"Team&gt; Unlock"釋放該檔案,或僅送出你的變化。這一行為将釋放該鎖并且讓其它的使用者也得到該檔案上的一把鎖。 

圖8.把一個Subversion屬性添加到一個檔案中

三) Tag和Branch

在Subversion中,很容易建立新的tag和branch。你可以使用tag來辨別一個特定的版本(使用一種可讀的名字,例如"Release 1.0")。;而一個branch用于新的開發工作而不影響主源碼基(稱作trunk)。在一個branch上的開發仍會繼續進行,直到開發者已經為把變 化內建回主trunk作好準備。

在Subversion中,branch和tag都是通過制作給定修訂的一個虛拟副本(以另一個名字 和/或另一個目錄)建立的。在正常情況下,branch存儲在branches目錄下,tag位于tags目錄下,盡管在實踐中為了滿足你的工程你可以使 用自己的任何定制。

從Eclipse中,"Team&gt;Branch/Tag"菜單能夠使你建立branch和tag(參考圖9)。其中,Browse按鈕提供了一種友善的方法來檢視有哪些branch和tag存在于倉庫中。

當你使用"Team&gt;Switch"建立成功一個新的branch或tag時,你可以非常容易地在branches之間進行切換。無論何時你切換 到一個不同的branch(或傳回到trunk),Subversion将僅更新檔案(它需要保持你的目前工作的副本與目的branch之間的同步)。

圖9.建立一新的branch或tag

(四) 修訂曆史

象大多數SCM系統一樣,Subversion讓你跟蹤你的源碼的變化。"Team&gt;Show in Resource History"菜單選項能夠使你查詢這些變化的清單(包括對一個檔案,目錄或甚至整個工程的改變)(見圖10)。

記住,在Subversion中,送出是原子性的-一次送出由一組檔案變化和一個全局注釋組成。"SVN Resource History"視圖向你顯示每一次送出的一個簡明視圖,包括修改的檔案和相關注釋。

圖10.曆史資源

四、結論

Subversion是一種強有力的和非常靈活的SCM工具,也是CVS的一個成功的後繼者。結合Subclipse,Subversion能最終在你的Eclipse IDE環境中得到全面的發揮。