在上一篇文章《用Subversion構(gòu)建版本控制環(huán)境》中,我們就Subversion的特性、安裝以及如何通過各種客戶端來操作資源庫進行了詳細的介紹。文章中Subversion是以獨立的服務(wù)方式運行,我們必須借住一些特定的客戶端,例如Subvresion本身提供的客戶端命令行程序、Eclipse插件以及集成在Windows資源管理器的TortoiseSVN工具。這些工具對于開發(fā)者而言當然是必須的,但是當我們有需要將資源庫發(fā)布在互聯(lián)網(wǎng)上的時候,就會讓我們的用戶操作起來非常不方便,用戶可能僅僅是需要瀏覽一下項目,卻要他安裝一堆程序,這難免讓人覺得繁瑣。
怎么讓我們的用戶可以通過一些常用的程序例如資源管理器或者是瀏覽器就可以方便的瀏覽Subversion的資源庫呢?因此本文將充分的發(fā)掘Subversion在資源庫共享方面的功能,同時對Subversion在權(quán)限控制方面的內(nèi)容進行詳細的介紹,同時也將詳細介紹如何將已有的CVS資源庫轉(zhuǎn)到Subversion上來。
我們曾經(jīng)提到過Subversion相比較而言在共享方面的功能是大大的超過了CVS系統(tǒng),它可以通過Apache服務(wù)器提供基于WebDAV/DeltaV協(xié)議的支持。有了它你就可以通過資源管理器或者瀏覽器對資源庫進行瀏覽以及操作。接下來我們將詳細介紹如何安裝并使用這個功能。(本文的所有軟件的安裝都是在Windows系統(tǒng)下進行)
1.?安裝Apache HTTP服務(wù)器
到http://httpd.apache.org下載最新的Apache服務(wù)器2.0.54版本的Windows安裝程序apache_2.0.54-win32-x86-no_ssl.msi,下載完畢直接安裝,使用默認設(shè)置進行安裝即可,安裝過程不再累贅。安裝完畢后使用瀏覽器打開網(wǎng)址http://localhost 檢查安裝是否成功完成。
如果Apache無法啟動請檢查是否機器上已經(jīng)裝有IIS,把IIS停掉后再啟動Apache服務(wù)進行測試。
2.?安裝Subversion
Subversion的安裝已經(jīng)在上一篇文章中詳細的介紹過了,如果你還不知道怎么安裝Subversion請參照《用Subversion構(gòu)建版本控制環(huán)境》。請確保將{subversion}\bin目錄是否在系統(tǒng)的PATH變量中存在,如果不存在請加上。
有一點需要說明的是,使用跟Apache HTTP服務(wù)器結(jié)合的方式,你無需再啟動SVNService服務(wù)。
3.?配置Apache HTTP服務(wù)器
首先在Subversion的安裝目錄下的bin子目錄找到這樣兩個文件mod_dav_svn.so和mod_authz_svn.so,將這兩個文件復(fù)制到Apache安裝目錄下的modules子目錄,另外還有四個文件分別是intl3_svn.dll、libdb43.dll、libeay32.dll、ssleay32.dll,把這四個文件拷貝到subversion的bin目錄或者是modules目錄。
打開Apache的配置文件httpd.conf,我們需要在該配置文件中通過LoadModule指令來加載Subversion的DAV模塊,例如下面一行信息。
LoadModule dav_svn_module modules/mod_dav_svn.so
需要注意的是,因為Apache本身帶有mod_dav模塊,如果你的Apache中這個模塊是動態(tài)?加載的而不是直接編譯進Apache的可執(zhí)行文件中的話,你應(yīng)該確保上面的指令在mod_dav模塊后面進行加載,默認的情況下mod_dav模塊是不啟用的,你需要把它前面的注釋去掉,如下:
LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so
同時另外一個模塊mod_authz_svn模塊也需要進行加載,可以把它放置在mod_dav_svn后,例如:
LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
接下來我們必須告訴Apache我們的資源庫所在的路徑,可以通過Location指令來完成這個設(shè)置。因為不希望為每個單獨的項目都進行單獨的設(shè)置,所以我們把所有項目都存放在統(tǒng)一的資源庫目錄,那么可以使用SVNParentPath指令來指定存放所有項目的路徑。在httpd.conf文件最后添加下面配置:
??? SVNParentPath d:/svn/repository
這樣我們就可以通過http://myhost/svn/<項目名> 來訪問存放于資源庫d:/svn/repository中的指定項目。當然有可能你并不希望某個項目提供這樣一種訪問方式,這時候你可以使用SVNPath為每個項目進行單獨的設(shè)置,SVNPath的使用方法如下:
??? SVNPath d:/svn/repository/project1
同樣把這段配置放在httpd.conf最后,重啟Apache HTTP服務(wù)即可通過http://myhost/svn/project1 來訪問project1項目的資源庫。
應(yīng)該提醒的是,所有的這些訪問都是匿名的,任何用戶只要能訪問這臺機器都可以訪問你所設(shè)定的資源庫,他可以對項目進行瀏覽、檢出或者是提交,我相信你肯定不希望發(fā)生這樣的事情,接下來我們將介紹如何做好訪問的權(quán)限控制。
現(xiàn)在我們先試著用Subversion自帶的客戶端提交一個項目以便于接下來的測試,隨便弄一個項目,執(zhí)行下列命令將項目加到資源庫中。
輸入:svn import .
http://localhost/svn
-m "test"
輸出:svn: PROPFIND request failed on '/svn'svn: PROPFIND of '/svn': 403
Forbidden (
http://localhost
)
怎么回事?403 Forbidden?原因是我們必須先給項目創(chuàng)建資源庫,D:\svn\repository只是我們存放所有項目的目錄,我們必須在這個目錄下創(chuàng)建要提交項目的資源庫。使用下面命令先給項目創(chuàng)建好資源庫
svnadmin create d:\svn\repository\project1
再次執(zhí)行import命令后,就可以成功的導(dǎo)入項目。打開瀏覽器輸入網(wǎng)址:http://localhost/svn/project1 看看你剛提交了什么:)
現(xiàn)在我們回顧一下新建一個項目的過程:首先必須使用svnadmin工具創(chuàng)建項目的資源庫,然后再導(dǎo)入項目文件。
4.?訪問用戶的身份驗證
在確定對訪問用戶的權(quán)限控制之前,你必須規(guī)劃好是對整個資源庫中的所有項目還是單獨的某一個項目進行統(tǒng)一的身份驗證, 也就是我們前面講到的是使用SVNParentPath還是SVNPath的問題。
最簡單的身份驗證方式是使用Basic HTTP Authentication機制,該方式通過用戶名和口令對訪問用戶進行身份驗證。我們可以直接通過Apache提供的支持進行設(shè)置。Apache提供一個htpasswd工具來管理用戶名和口令。接下來我們利用這個工具來添加兩個用戶。
在命令行窗口中轉(zhuǎn)到Apache所在的目錄,假設(shè)是 D:\Apache\bin,執(zhí)行下列命令
說明:創(chuàng)建用戶liudong1
輸入:htpasswd –cm D:\svn\svn_auth_passwd liudong1
說明:使用-c參數(shù)來創(chuàng)建一個passwd文件
輸出:
New password: *****
Re-type new password: *****
Adding password for user liudong1
說明:創(chuàng)建用戶liudong2
輸入:htpasswd –m D:\svn\svn_auth_passwd liudong2
說明:passwd文件已經(jīng)創(chuàng)建,無需再使用-c參數(shù)
輸出:
New password: *****
Re-type new password: *****
Adding password for user liudong2
打開D:\svn\svn_auth_passwd文件,密碼使用MD5加密過了,而且同樣的密碼加密出來的內(nèi)容卻不相同,估計跟用戶名也是有一點關(guān)系,內(nèi)容如下:
liudong1:$apr1$5G3.....$x5jgK.sGp/Y3EFSXGMtoE.
liudong2:$apr1$cG3.....$IM5m73cqw8N8ZsMcJnKeX.
接下來我們必須告訴Apache服務(wù)器如何使用這個passwd文件,打開httpd.conf找到剛才我們添加的Location配置的位置,修改如下:
SVNParentPath d:/svn/repository
AuthType Basic
AuthName "Subversion repository"
AuthUserFile d:/svn/svn_auth_passwd
Require valid-user
重新啟動Apache HTTP服務(wù)器,使用瀏覽器打開 http://localhost/svn/project1 你將會看到要求登錄的對話框如下圖所示(我所使用的是Opera 8瀏覽器),輸入你剛設(shè)置的用戶名和口令即可。
這就是利用Basic HTTP Authentication機制對用戶進行訪問控制的方法。你還可以使用SSL證書管理來加強Subversion的安全性(HTTPS的配置屬于Apache HTTP服務(wù)器的范疇,請參照Apache的文檔),甚至你可以對設(shè)置對某些操作才需要驗證用戶的身份以及賦予不同用戶對不同目錄的操作權(quán)限,以及如何使用Windows的域帳號進行身份的驗證。這些內(nèi)容可以參考Subversion提供的文檔svn-book.pdf的第六章——服務(wù)器配置。
以上介紹的是Subversion跟Apache結(jié)合提供基于HTTP方式的共享功能以及如何對用戶進行身份的驗證。接下來我們介紹大部分CVS用戶非常關(guān)系的——如何將現(xiàn)有的CVS資源庫移植到Subversion下。
我們可以通過一個cvs2svn的工具來將CVS資源庫轉(zhuǎn)到Subversion服務(wù)器上。Cvs2svn是一個用Python寫的轉(zhuǎn)換腳本,它的作用是用來一次性的從CVS轉(zhuǎn)到Subversion,你不要指望它幫你同步CVS和Subversion資源庫。如果你并不需要項目的一些歷史修改信息,那么你最好先從CVS獲取最新版本,然后提交到Subversion資源庫中,這是最簡單直接而有效的方法。如果你需要保留CVS意見的所有修改記錄,那么接下來我們就是介紹如何通過cvs2svn來轉(zhuǎn)換你的資源庫。
首先我們需要安裝Python,因為cvs2svn是用Python寫的一些腳本。到 http://www.python.org/download/ 下載最新版本的Python for Windows的安裝程序python-2.4.1.msi,按照默認的方式安裝Python,假設(shè)安裝目錄是C:\Python。接下來下載cvs2svn,下載地址是:http://cvs2svn.tigris.org/servlets/ProjectDocumentList?folderID=2976,用WinRAR解壓到任一個目錄下。打開命令行窗口轉(zhuǎn)到cvs2svn所在的目錄先測試一下python,執(zhí)行C:\python\python cvs2svn,這時候會輸出cvs2svn的幫助信息。
由于cvs2svn用到了GUN sort工具,因此我們還必須到http://unxutils.sourceforge.net/ 下載UnxUtils.zip,把該壓縮包下的usr/local/wbin/sort.exe文件解壓到cvs2svn目錄中;同時我們還需要下載RCS的一個工具co.exe,到http://www.cs.purdue.edu/homes/trinkle/RCS/ 下載rcs57pc1.zip,把該壓縮包中的bin/win32下的rcslib.dll以及co.exe這兩個文件同樣解壓到cvs2svn目錄中。
接下來我們開始轉(zhuǎn)換資源庫,輸入以下命令
C:\Python\python cvs2svn –s d:\svn\repository\project1
其中我們假設(shè)project1是原有CVS資源庫中的一個項目。
下面是在我的機器上轉(zhuǎn)換完畢后cvs2svn顯示詳細的統(tǒng)計信息:
cvs2svn Statistics:
------------------
Total CVS Files:???????????????? 7
Total CVS Revisions:???????????? 7
Total Unique Tags:?????????????? 0
Total Unique Branches:?????????? 0
CVS Repos Size in KB:???????? 2261
Total SVN Commits:?????????????? 2
First Revision Date:??? Sat Sep 03 15:05:26 2005
Last Revision Date:???? Sat Sep 03 15:05:27 2005
------------------
Timings:
------------------
pass 1:???? 0 seconds
pass 2:???? 0 seconds
pass 3:???? 0 seconds
pass 4:???? 0 seconds
pass 5:???? 0 seconds
pass 6:???? 0 seconds
pass 7:???? 0 seconds
pass 8:???? 1 second
total:????? 3 seconds
轉(zhuǎn)換完畢后我們用瀏覽器打開 http://localhost/svn/project1 即可看到
點擊trunk鏈接就可以看到項目的所有文件,接下來可以把你需要轉(zhuǎn)換的項目重復(fù)執(zhí)行上面的步驟即可。
以上是本文要介紹的內(nèi)容,涉及實際應(yīng)用中經(jīng)常要面臨的問題。以獨立服務(wù)方式運行的Subversion其守護端口是3690,我們通過其跟Apache HTTP服務(wù)器結(jié)合使之可以方便的在互聯(lián)網(wǎng)上進行資源庫的發(fā)布;同時對于現(xiàn)在正在使用CVS的用戶來講可以通過cvs2svn來轉(zhuǎn)換已有的資源庫到Subversion上,這可打消CVS用戶在考慮移植時候的顧慮。
參考資料
《用Subversion構(gòu)建版本控制環(huán)境》
http://www-128.ibm.com/developerworks/cn/opensource/os-subversion/
Subversion的官方網(wǎng)站??http://subversion.tigris.org/
CVS2SVN????http://cvs2svn.tigris.org/
Apache網(wǎng)站????http://httpd.apache.org/
Python官方網(wǎng)站???http://www.python.org/
Windows域用戶驗證模塊?http://tortoisesvn.tigris.org/mod_auth_sspi.zip