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