摘要
長久以來,在開源世界中,CVS(Concurrent Versions System)一直都是版本控制的首選。但是現在用戶有了另一個選擇,就是Subversion。Subversion是下一代版本控制系統,能替代 CVS,項目主頁是http://subversion.tigris.org。
長久以來,在開源世界中,CVS(Concurrent Versions System)一直都是版本控制的首選。但是現在用戶有了另一個選擇,就是Subversion。Subversion是下一代版本控制系統,能替代 CVS,項目主頁是http://subversion.tigris.org。
Subversion是一個自由、開放源碼的版本控制系統。它是一個通用系統,可用來管理任何類型的文件, 其中包括程序源碼。
它的初始目標很明確,實現絕大部分CVS的已有功能;充分考慮現有的CVS用戶,在使用方式上模仿CVS,同時開發了一系列工具,使得基於CVS的項目能夠順利遷移到Subversion上。和CVS相比,它有很多優點,例如目錄版本控制、不可分割的提交、一致的數據處理方式和更有效率的分支與標記等。
安裝與初始化
Subversion建立在一個可移殖的APR (Apache Portable Runtime,鏈接庫)上。這使得Subversion可以工作在任何可以執行Apache的操作系統上。
Subversion有兩種運行方式,一是可以作為Apache 2.0的一個模塊,以WebDAV/DeltaV協議與外界連通;另外,也可使用Subversion 自帶的小型服務器程序。該程序使用的是自帶的通訊協議,可以很容易地透過SSH以tunnel方式使用。
最簡單的安裝Subversion的方法就是使用其提供的二進制版本(在項目網站上,有RPM、DEB和PORTS等格式的文件下載)。根據系統選擇下載所需的文件,這裡使用的Red Hat,所以選擇了RPM格式。
#rpm -Uvh apr-0.9.5-0.2.i386.rpm
#rpm -Uvh apr-devel-0.9.5-0.2.i386.rpm
#rpm -Uvh apr-util-0.9.5-0.1.i386.rpm
#rpm -Uvh apr-util-devel-0.9.5-0.1.i386.rpm
#rpm -Uvh neon-0.24.4-1.i386.rpm
#rpm -Uvh neon-devel-0.24.4-1.i386.rpm
#rpm -Uvh subversion-1.0.0-1.rh90.i386.rpm
#rpm -Uvh subversion-devel-1.0.0-1.rh90.i386.rpm
#rpm -Uvh subversion-server-1.0.0-1.rh90.i386.rpm
#rpm -Uvh subversion-tools-1.0.0-1.rh90.i386.rpm
設置環境變量,命令如下:#eXPort EDITOR=vi
創建文件庫,命令如下:#svnadmin create /opt/proj/fox
將目錄doc的內容,直接導入至文件庫的fox目錄裡,命令如下:#svn import /root/doc file:///opt/proj/fox
Subversion組件
安裝好之後,Subversion 會有數個不同的工具,主要分為客戶端組件和服務器組件兩類。
客戶端組件供使用者使用,主要包括以下兩個組件:
svn 是命令行客戶端程序,用來管理數據。
Svnversion 用來查看工作拷貝的混合版本狀態。
服務器組件供管理員使用,包括以下幾個組件:
svnlook 用來查看Subversion的文件庫的工具。
Svnadmin 用來創建與調整Subversion的文件庫的工具。
mod_dav_svn 給Apache2.0網頁服務器使用的模塊;可以用來將用戶的文件庫透過網絡對外開放。
Svnserve 一個獨立的服務器程序,可以作為服務器進程執行,或是被SSH啟動,讓用戶的文件庫在網絡上可供其它人存取的方法。
優勢所在
Subversion在使用方式上與CVS相像,但是某些新的功能與設計和CVS是有區別的。下面談談兩者的區別,讓用戶切實感受Subversion的優勢。
不同的修訂版號
在CVS中,每個文件修訂版號是不同的。這是因為CVS基於RCS。每一個文件在文件庫都有對應的RCS文件,而文件庫的結構,大致上就是依照目錄結構展開。
目錄版本
Subversion也會追蹤文件樹結構,而不只是文件內容。Subversion中目錄像文件一樣,也有修訂版號。“svn add”與“svn rm”命令可在目錄上使用,就像在文件上使用一樣。“svn copy”與“svn move”也是如此。但是這些目錄不會馬上讓文件庫有任何的變化。相反地,工作項目只是“預定”要被新增或刪除。除非用戶執行“svn commit”,不然文件庫不會有任何變動。這一點有點像Windows下刪除文件,只是在fat表作刪除標記,而未真刪除。
離線功能
Subversion的工作副本是針對網絡帶寬瓶頸做優化。.svn與CVS目錄一樣,都是管理用的目錄,但是svn還多存放了文件的原始副本。這讓用戶能夠離線進行許多事,舉例如下:
“svn status”顯示本地更新;
“svn diff”顯示詳細的更新細節;
“svn revert”移除用戶的本地更新。
另外,Subversion客戶端在提交文件副本時只傳送差異。這點是CVS沒有的。
區分狀態與更新
在Subversion中,我們試著要解決“cvs status”與“cvs update”命令之間的混淆不清。“cvs status”命令有兩個目的,一是顯示使用者在工作副本中的本地更改;二是顯示使用者過時的文件。但是CVS顯示的內容不易理解,許多CVS的使用者完全無法善用這個命令。取而代之地,就是執行“cvs up”來看他們的更新。
Subversion試著讓“svn status”輸出的數據易於讓人理解,來解決上面這個問題。另外,“svn update”只會顯示被更新的文件信息,而不會顯示本地的更新。
屬性
Subversion的一個新功能,就是用戶可以將任何的資料附加到文件與目錄上。這些資料被稱為屬性。用戶要設定或取得屬性的名稱,可使用“svn propset”與“svn propget”命令;要列出一個對象上所有的屬性,可使用“svn proplist”命令。
沖突消解
CVS會在文件內放置“沖突標記”,將沖突地方標示出來,但CVS做得並不夠。許多使用者記不住(或沒看清)在終端上快速閃過的帶有沖突標志的代碼。
Subversion解決這個問題的方法是讓沖突更明確地標示出來。它會記得文件處於沖突的狀態中,除非用戶執行了“svn resolved”命令,否則它不會允許用戶提交。
二進制文件與文本文件
Subversion比CVS更善於處理二進制文件。因為CVS使用RCS的關系,所以對於一個變動中的二進制文件,它將每個更新的副本都儲存下來。但是Subversion不管文件是文本還是二進制類型,在內部都是以二進制差異比較算法來表示文件的更新部分。這表示所有的文件在文件庫中都是以差異的形式儲存。而且在網絡上傳輸的,都是較小的文件差異部分。
CVS 使用者必須以“-kb”標記二進制文件。Subversion不進行任何的關鍵詞或列尾符號轉換,除非用戶要求這麼做。Subversion內部會維護文件是否為“文本”或“二進制”文件的記錄,將其保存在工作副本中。在執行“svn update”的過程中,Subversion 會對本地的文本文件進行內容合並,但是不會對二進制文件做這樣的事。
小結
Subversion有一份很好的文檔——《Version Control with Subversion》(http://svnbook.red-bean.com/)。它提供了有關Subversion的各方面內容,如使用、管理和開發等。
經過數年的開發,以替代CVS為目標的Subversion,終於出了1.0版本。相信以其強大的功能,對CVS良好的繼承性,一定會有很好的發展。
二進制文件與文本文件
Subversion比CVS更善於處理二進制文件。因為CVS使用RCS的關系,所以對於一個變動中的二進制文件,它將每個更新的副本都儲存下來。但是Subversion不管文件是文本還是二進制類型,在內部都是以二進制差異比較算法來表示文件的更新部分。這表示所有的文件在文件庫中都是以差異的形式儲存。而且在網絡上傳輸的,都是較小的文件差異部分。
CVS 使用者必須以“-kb”標記二進制文件。Subversion不進行任何的關鍵詞或列尾符號轉換,除非用戶要求這麼做。Subversion內部會維護文件是否為“文本”或“二進制”文件的記錄,將其保存在工作副本中。在執行“svn update”的過程中,Subversion 會對本地的文本文件進行內容合並,但是不會對二進制文件做這樣的事。
小結
Subversion有一份很好的文檔——《Version Control with Subversion》(http://svnbook.red-bean.com/)。它提供了有關Subversion的各方面內容,如使用、管理和開發等。
經過數年的開發,以替代CVS為目標的Subversion,終於出了1.0版本。相信以其強大的功能,對CVS良好的繼承性,一定會有很好的發展。