1. 程式人生 > >搭建可用http訪問的svn(windows)

搭建可用http訪問的svn(windows)

    SVN是Subversion的簡稱,是一個開放原始碼的版本控制系統,廣泛應用於專案的團隊開發之中,達到方便共用資源的目的。在個人開發之中,也可以使用SVN來管理自己的原始碼,或者通過SVN釋出自己的專案工程程式碼,如BAE中應用的部署。本文主要介紹在windows環境下,搭建自己的svn服務端。環境及需要的軟體,詳細資訊如下:
環境:windows7旗艦版service pack1
軟體:Setup-Subversion-1.8.15.msi (下載網址 http://subversion.apache.org/packages.html
TortoiseSVN-1.9.3.27038-x64-svn-1.9.3.msi(下載網址

https://tortoisesvn.net/downloads.html
httpd-2.2.31-x86-r3.zip(下載網址http://www.apachehaus.com/cgi-bin/download.plx
額外推薦使用的軟體:如notepad++、ultraEdit等,此類軟體更優於windows自帶的記事本,可以進行字串批量替換,還顯示行號,在遇到錯誤需要排除時候,可以方便定位到錯誤所在行號,本人現在使用ultraEdit,其介面也是相當不錯的。

svn伺服器有2種執行方式:獨立伺服器和藉助apache執行。兩種方式各有利弊,使用者可以自行選擇。
1、獨立伺服器執行,就配套使用svn客戶端,使用svn協議進行專案的版本控制,如commit、checkout等所有操作,這時候就只能以svn協議開頭,如圖1
獨立伺服器模式:svn客戶端import


圖1
    假設這裡寫成http://192.168.0.5/webDemo,在獨立伺服器執行模式下,將會報錯。
2、藉助Apache執行。這裡就可以實現http或者https協議來訪問。例如,在svn客戶端中使用http進行checkout操作,如圖2;在瀏覽器中訪問svn服務中的庫檔案,如圖3
這裡寫圖片描述
圖2
這裡寫圖片描述
圖3

第一種方式,獨立伺服器執行,直接將svn服務端與svn客戶端一步一步安裝即可。

建立svn服務版本庫: svnadmin create PATHNAME ,假設pathname中有空格,需要將pathname用英文雙引號引起來。
在版本庫的conf資料夾(即PATHNAME的conf資料夾)下,修改svnserve.conf檔案,將

#anon-access = read
#auth-access = write
#password-db = passwd

前面的#都去掉,注意,保持每行語句的前面沒有空格!
然後在版本庫的conf資料夾下,修改passwd檔案,如在最後一行新增admin=123456 ,表示使用者名稱為admin,密碼為123456,這裡可以建立多個使用者,在使用svn客戶端進行操作時候,將會有驗證操作,需要使用者名稱及密碼來驗證身份許可權。
啟動svn服務: svnserve -d -r E:\Apache22\svnData ,當然也可以將svn服務註冊到windows系統服務中,命令如下
sc create svn binpath= “C:\Subversion\bin\svnserve.exe –service -r G:\svnData” displayname= “Subversion服務” depend= Tcpip ,注意=後面都是由空格的。
刪除系統服務中的服務:sc delete 服務名稱

第二種方式 藉助Apache,搭建可用http(或者https)訪問的svn

詳細步驟如下
1、解壓httpd-2.2.31-x86-r3.zip,將Apache22資料夾放置到系統某盤的根目錄下。筆者將其放在E盤根目錄下。
2、找到E:\Apache22\conf\httpd.conf檔案,修改“ServerRoot”節點處為 ServerRoot “E:/Apache22” 。
修改Apache埠號。假設你的電腦中沒有程式會使用80埠、443埠,那麼此步驟可以跳過。
    輸入“netstat -ano”檢視所有端口占用情況,如圖4.假設如果覺得顯示出來的太多不方便查詢,就輸入“netstat -ano | findstr “埠號””來進行篩選,如netstat -ano | findstr 80。筆者安裝了VMware,VMware預設使用了443埠。而且筆者的80埠已經被佔用了,故將Apache的埠80改為100,Apache裡的ssl監聽埠由443改為442。修改埠號這一步,將E:\Apache22\conf目錄下的所有檔案都進行查詢一下,所有的80都改為100,所有的443都改為442,可以使用ultraEdit軟體進行多檔案批量查詢,批量替換,這樣速度較快,節省時間。為了避免埠號衝突,除了可以修改Apache埠號的辦法,還可以修改VMware(或其他佔用了80、443埠的軟體)使用的埠號,具體方法不再重複,自行百度。檢視佔用了埠號的軟體,開啟工作管理員,並顯示PID列,如果工作管理員已經有PID一列則可以跳過次步驟,“Ctrl+Shift+Esc”開啟工作管理員,選單選擇“檢視”→“選擇列”,在彈出視窗中勾選“PID(程序識別符號)”後確定。

圖4
圖4
在cmd視窗中執行 “E:\Apache22\bin\bin\httpd.exe” -k install -n apache22 切記,包含引號。該命令的意思是,安裝apache服務,並將該服務名稱命名為apache22(你也可以改成別的)。
回車,服務安裝完畢,完畢後,會自動測試,若有問題,視窗會提示錯誤,此時,請根據錯誤自行排查。
正常安裝完畢如下圖5所示:
其中,Errors reported here must be corrected before the service can be started.意思是,若該句話後面有錯誤資訊,則表示服務安裝失敗,需要先改正錯誤。若沒有,則成功。可以使用net start apache22 啟動Apache服務,或者在計算機管理——服務中啟動Apache22服務,如圖6所示,在瀏覽器中輸入http://localhost:100,看到圖7所示介面,則表示Apache正常。
這裡寫圖片描述
圖5
這裡寫圖片描述
圖6
這裡寫圖片描述
圖7
3、將Subversion\bin 目錄下的mod_dav_svn.so、mod_authz_svn.so 檔案拷貝到E:\Apache22\modules。將Subversion\bin 目錄下動態庫
libdb48.dll 、intl3_svn.dll 、ssleay32.dll 、libeay32.dll 拷貝出來放在 E:\Apache22\bin 目錄下,特別注意:在E:\Apache22\bin資料夾下面可能有同名的檔案,拷貝到資料夾下,一定不要替換原檔案!
偷懶的辦法:可以將Subversion\bin資料夾下面的所有dll檔案拷貝到E:\Apache22\bin 目錄下。
4、修改 E:\Apache22\conf\httpd.conf檔案,去掉以下行的註釋

#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_module modules/mod_dav.so 
在LoadModule節的最後新增以下兩行: 
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so 

重啟apache,net start apache22,當apache無法啟動,或者無法載入某個動態庫的時候,一般先檢查該動態庫的關聯情況,可以使用dependency worker軟體檢測某檔案所依賴的其他dll檔案。假設將Subversion\bin資料夾下面的所有dll檔案拷貝到E:\Apache22\bin 目錄下,一般不會報錯。
5、建立passwd檔案
在命令列下面將當前目錄切換到apache22\bin目錄, 輸入命令:
htpasswd.exe -c passwd username
New password: ** (輸入密碼)
Re-type new password: **
然後將會看到,新產生一個passwd檔案,使用ultraedit開啟之後,可以看到明文展示的使用者名稱,密碼則是加密之後的。注意這裡的使用者名稱及密碼,是用於apache驗證的。拷貝此檔案到F:\svnData\conf資料夾目錄下
6、修改E:\Apache22\conf\httpd.conf檔案,在此檔案的最後新增以下程式碼

<Location /svnData>
DAV svn
SVNListParentPath on
SVNPath E:\Apache22\svnData\webDemo
AuthType Basic
#SSLRequireSSL
AuthName "the admin full name, the same with password"
AuthUserFile "F:/svnData/conf/passwd"
AuthzSVNAccessFile "F:/svnData/conf/authz"
Require valid-user
#Satisfy Any
 </Location>

含義解釋
首行加#表示註釋
SVNPath版本庫所在目錄;SSLRequireSSL 用SSL提高版本庫安全,禁用無SSL的http訪問方式;SVNPath版本庫所在目錄;
AuthType Basic 啟用基本的驗證,比如使用者名稱/密碼;AuthName “my Subversion Server” #驗證時代提示;AuthUserFile “F:/svnData/conf/passwd” 使用者檔案所在目錄;AuthzSVNAccessFile “F:/svnData/conf/authz” 許可權配置所在目錄;Require valid-user 限定使用者只有輸入正確的使用者名稱及密碼後才能訪問這個路徑
7、建立認證檔案authz

[groups]
group1 = yang
[/] 
@group1 = rw

groups表示分組,下面可以有多個組,每個組裡面可以有多個使用者,如group1=yang,hbtcm,informationEngineering
[/],表示所有庫的根目錄,同理,[/src]表示所有庫的根目錄下的src目錄,使用[project1:/]類似這樣的URL:svn://192.168.0.2/project1 即可訪問project1
@ 表示接下來的是一個組名,不是使用者名稱,當然也可以將@group1=yang改為yang=rw ,表達的意義完全一樣。
使用者的許可權就分只讀(‘r’)、讀寫(’rw’)和禁止訪問(”);還可以在最後加上* = r ,*表示“除了上面提到的那些人之外的其餘所有人”,也就是“除了group1組外的其他所有人”
* = r 則表示“那些人只能讀,不能寫”
對中文目錄進行許可權控制時,應該將許可權檔案authz改為utf-8格式

8、新建svnData資料夾,筆者建立在E:\Apache22目錄下。
svnadmin create –compatible-version 1.6 E:\Apache22\svnData\webDemo
注意:這裡需要使用svnadmin create –compatible-version 1.6 PATHNAME 的格式,否則會報錯“(20014)Internal error (specific information not available): Expected FS format between ‘1’ and ‘6’; found format ‘7’”。此錯誤提示可以在E:\Apache22\logs\error.log檔案裡面看到。
9、按照伺服器獨立執行模式,修改E:\Apache22\svnData\webDemo\conf資料夾下面的svnserve.conf檔案與passwd檔案。
開啟svnserver服務 svnserve -d -r E:\Apache22\svnData
10、更深部分,Apache上使用自己認證的SSL證書進行認證,採用https服務來配置svn
進入到E:\Apache22\conf資料夾

set OPENSSL_CONF=openssl.cnf
建立公鑰檔案 every.key
openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.csr -config .\openssl.cnf
對認證簽署請求進行認證並獲取認證證書,最終得到了最後一個檔案,經認證的證書 severy.crt 
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

配置期間遇到的問題及解決辦法
報錯:Expected FS format between ‘1’ and ‘6’; found format ‘7’
版本衝突,使用svnadmin create –compatible-version 1.6 PATHNAME建立svn版本庫,可以解決此問題

svn –version 命令與 svnserve –version 命令,可以檢視svn客戶端與服務端的版本

其他備註:
如果是先安裝好了Subversion,那麼就需要特備註意當時安裝的Subversion是32位的版本還是64位的版本,假設習慣性地將所有的軟體都安裝在Program Files檔案目錄裡面,而不區分32位與64位,那麼可能會習慣性地認為:電腦的作業系統是64位的,所以我的軟體也是64位的。
下載與Subversion對應版本的Apache,要麼都是32位,要麼都是64位。而且Apache還區分2.2._ 與2.4_ 的版本。然後將Subversion安裝目錄bin下的dll檔案複製到Apache檔案目錄bin時候,假設有一樣的dll檔案,注意不要替換原檔案!!!

報錯 Cannot load modules/mod_ssl.so ,仔細檢查自己的步驟,經過上述步驟多半可以解決。

備註:可以使用Dependency Walker工具來分析某檔案所依賴的其他dll檔案、檔案中的函式有哪些。

Subversion(SVN)作為一個單獨的版本管理軟體是不具備網頁瀏覽功能的。就是說,你可以用版本管理的客戶端比如:TotoriseSVN來和SVN伺服器進行連線。這樣如果你的電腦沒有安裝SVN客戶端就不能使用SVN伺服器提供的服務了。為了實現請求客戶端的目標,就想通過網頁來進行訪問瀏覽。所以就將網頁瀏覽的功能通過Apache伺服器來實現。而通過Apache的外掛來和SVN進行連線後,使用者可以通過瀏覽器:IE,Firefox,NetScape等,訪問SVN伺服器。這樣很方便了。現在有不少的SVN伺服器軟體直接提供網頁功能,而且支援圖形介面,如VisualSVN。NetBeans,Eclipse等開發IDE都可以配置SVN外掛,很容易用的。[摘自百度知道]

vmware虛擬機器vmware-hostd.exe佔用了埠號443
方法一:修改apache的埠號,由443改為442(可以是任意其他未被佔用的埠號)
針對httpd-2.4.18-x64-vc11-r3版本的Apache24
Apache安裝目錄\conf\extra 資料夾目錄下httpd-ahssl.conf 與 httpd-ssl.conf
Apache安裝目錄\conf\original\extra 目錄下的 httpd-ssl.conf 檔案
針對httpd-2.2.31-x86-r3,可以使用ultraedit軟體,開啟config資料夾下的所有子資料夾及其檔案,修改所有的443埠號為其他埠號。
方法二:修改vmware的埠號