Windows下架設Subversion伺服器
http://indian.blog.163.com/blog/static/10881582007112415021751/
作者:indian
版本:v1.0
修訂:2007年12月23日23:37:41
出處:blog.kysf.net
版權:作者保留對本文的一切修改、釋出等權力。任何人想要轉載本文部分或全部内容時,必須保留包括作者、版本、修訂、出處、版權,共五項資訊。對本文的參考引用,則不受限制。
關鍵詞:subversion, 安裝配置, 權限, 目錄通路
前言
基本概念
什麼是版本控制
什麼是 Subversion
版本庫(repository)
安裝配置
安裝獨立伺服器 SVNServer
安裝 ApacheSVN 伺服器
FAQ
參考資料
前 言
花了72小時,終于把 Subversion 初步掌握了。從一個連“什麼是版本控制”都不知道的門外漢,到配置出精确至每目錄通路的入門者,中間還卡了一天時間。其中費了許多氣力,摸索實驗了多次,還差點放棄了,但是收獲是巨大的。現把我的配置和學習過程寫下來,供大家參考,也讓初學者少走彎路。
由于本人不會 Unix/Linux (正在學習中),故僅以 Windows 平台為例講解,Unix/Linux 平台請參考相關資料。如其中有謬誤的地方,包括錯别字,請聯系我修訂。
技術在分享中進步!
基本概念
1、什麼是版本控制
簡單點來說,版本控制就是資料倉庫,它可以記錄你對檔案的每次更改。這樣,就算你在昏天黑地的改了幾個月後老闆說不要了,還是按照過去那樣,你也不會抓狂,簡單的恢複版本操作就搞定一切。
2、什麼是 Subversion
Subversion是一個自由/開源版本控制系統,它管理檔案和目錄可以超越時間。一組檔案存放在中心版本庫,這個版本庫很像一個普通的檔案伺服器,隻是它可以記錄每一次檔案和目錄的修改,這便使你可以取得資料以前的版本,進而可以檢查所作的更改。從這個方面看,許多人把版本控制系統當作一種“時間機器”。
Subversion可以通過網絡通路它的版本庫,進而使使用者可以在不同的電腦上使用。一定程度上可以說,允許使用者在各自的地方修改同一份資料是促進協作。進展可能非常的迅速,并沒有一個所有的改變都會取得效果的通道,由于所有的工作都有曆史版本,你不必擔心由于失去某個通道而影響品質,如果存在不正确的改變,隻要取消改變。
一些版本控制系統也是軟體配置管理(SCM)系統,這種系統經過特定的精巧設計來管理源代碼,有許多關于軟體開發的特性—本身了解程式設計語言、或者提供建構程式的工具。然而,Subversion不是這樣一個系統,它是一個通用系統,可以管理任何類型的檔案集,對你這可能是源代碼,對别人,可能是一個貨物報價單或者是書稿等。
3、版本庫(repository)
Subversion 的核心就是 rpository ,中文翻譯成“版本庫”。就是位于伺服器端,統一管理和儲存資料的地方。
安裝配置
安裝獨立伺服器 SVNServer
環境
OS:Windows XP SP2
Web:Apache 2.2.6
SVN:svn-win32-1.4.6
一、準備工作
1、擷取 Subversion 伺服器程式
到官方網站(http://subversion.tigris.org/)下載下傳最新的伺服器安裝程式。目前最新的是1.4.6版本,具體下載下傳位址在:http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&expandFolder=8100&folderID=91 ,注意找 for apache 2.2.x 版本的。
2、擷取 TortoiseSVN 用戶端程式
從官方網站 http://tortoisesvn.net/downloads 擷取最新的 TortoiseSVN 。TortoiseSVN 是一個用戶端程式,用來與 subvers 伺服器端通訊。Subversion 自帶一個用戶端程式 svn.exe ,但 TortoiseSVN 更好操作,提高效率。
二、安裝伺服器端和用戶端
首先安裝 Apache 2.2.6 ,具體安裝方法大家參考相關資料,或者參看我寫的《Windows下安裝Apache 2.2.x》。
其次安裝 Subversion(以下簡稱SVN)的伺服器端和用戶端。下載下傳下來的伺服器端是個 zip壓縮包,直接解壓縮即可,比如我解壓到 E:/subversion 。用戶端安裝檔案是個 exe 可執行檔案,直接運作按提示安裝即可,用戶端安裝完成後提示重新開機。
三、建立版本庫(Repository)
運作Subversion伺服器需要首先要建立一個版本庫(Repository)。版本庫可以看作是伺服器上集中存放和管理資料的地方。
開始建立版本庫。首先建立 e:/svn 空檔案夾作為所有版本庫的根目錄。然後,進入指令行并切換到subversion的bin目錄。輸入如下指令:
svnadmin create E:/svn/repos1
此指令在 E:/svn 下建立一個版本庫 repos1 。repos1 下面會自動生成一些檔案夾和檔案。
我們也可以使用 TortoiseSVN 圖形化的完成這一步:
先建立空目錄 E:/svn/repos1 ,注意一定是要空的。然後在 repos1 檔案夾上“右鍵->TortoiseSVN->Create Repository here...”,然後可以選擇版本庫模式,這裡使用預設的FSFS即可,然後就建立了一系列檔案夾和檔案,同指令行建立的一樣。
四、運作獨立伺服器
此時 subversion 服務還沒有開始,隻是通過它的指令建立了版本庫。繼續在剛才的指令視窗輸入:
svnserve.exe –daemon
svnserve 将會在端口 3690 等待請求,--daemon(兩個短橫線)選項告訴 svnserve 以守護程序方式運作,這樣在手動終止之前不會退出。注意不要關閉指令行視窗,關閉視窗會把 svnserve 停止。
為了驗證svnserve正常工作,使用TortoiseSVN -> Repo-browser 來檢視版本庫。在彈出的 URL 對話框中輸入:
svn://localhost/svn/repo1
點 OK 按鈕後就可以看見 repo1 版本庫的目錄樹結構了,隻不過這時 repo1 是個空庫。
你也可以使用--root選項設定根位置來限制伺服器的通路目錄,進而增加安全性和節約輸入svnserve URL的時間:
svnserve.exe --daemon --root drive:/path/to/repository
以前面的測試作為例,svnserve 将會運作為:
svnserve.exe --daemon --root e:/svn
然後TortoiseSVN中的版本庫浏覽器URL縮減為:
svn://localhost/repo1
五、配置使用者和權限
用文本編輯器打開E:/svn/repos1/conf目錄,修改svnserve.conf:
将:
# password-db = passwd
改為:
password-db = passwd
即去掉前面的 # 注釋符,注意前面不能有空格。
然後修改同目錄的passwd檔案,增加一個帳号:
将:
[users]
# harry = harryssecret
# sally = sallyssecret
增加帳号:
[users]
#harry = harryssecret
#sally = sallyssecret
test = test
六、初始化導入
下面就是将我們的資料(項目)導入到這個版本庫,以後就由版本庫管理我們的資料。我們的任何改動都回被版本庫記錄下來,甚至我們自己丢失、改錯資料時版本庫也能幫我們找回資料。
比如,我在 d:/wwwroot 下有個 guestbook 檔案夾,裡面存放的是我編寫的留言簿程式。在此檔案夾上“右鍵 -> TortoiseSVN -> Import...” ,在彈出對話框的“URL of repository”輸入“svn://localhost/repos1/guestbook”。在“Import message”輸入“導入整個留言簿”作為注釋。
點 OK 後要求輸入帳号。我們在使用者名和密碼處都輸入 test 。完成後 guestbook 中的内容全部導入到了 svn://localhost/svn/repo1/guestbook 。
我們看到在 e:/svn/repo1 沒有任何變化,連個 guestbook 檔案夾都沒有建立,唯一的變化就是e:/svn/repo1容量變大了。實際上我們源guestbook中的内容已經導入 repo1 版本庫了,源 guestbook 檔案夾可以删除了。
需要注意的是,這一步操作可以完全在另一台安裝了 TortoiseSVN 的客戶機上進行。例如運作svnserve的主機的IP是133.96.121.22,則URL部分輸入的内容就是“svn://133.96.121.22” 。
七、基本操作流程
1、取出(check out)
取出版本庫到一個工作拷貝:
來到任意空目錄下,比如在f分區建立一個空檔案夾 f:/work 。“右鍵 -> SVN Checkout”。在“URL of repository”中輸入“svn://localhost/svn/repo1/guestbook”,這樣我們就得到了一份 guestbook 中内容的工作拷貝。
2、存入(check in)/送出(commit)
在工作拷貝中作出修改并送出:
在 guestbook 工作拷貝中随便打開一個檔案,作出修改,然後“右鍵 -> SVN Commit... ”。這樣我們就把修改送出到了版本庫,版本庫根據情況存儲我們送出的資料。
在修改過的檔案上“右鍵 -> TortoiseSVN -> Show Log” ,可以看到對這個檔案所有的送出。在不同的 revision 條目上“右鍵 -> Compare with working copy”,我們可以比較工作拷貝的檔案和所選 revision 版本的差別。
安裝 ApacheSVN 伺服器
Subversion的設計包括一個抽象的網絡層,這意味着版本庫可以通過各種伺服器程序通路。理論上講,Subversion可以使用無限數量的網絡協定實作,目前實踐中存在着兩種伺服器。
- SVNServer:svnserve 是一個小的(也叫輕型的)、獨立伺服器,使用自己定義的協定和用戶端。(作者注:以下稱這種伺服器為“svnserver伺服器”,上面的安裝配置就是安裝svnserver伺服器。)
- ApacheSVN:Apache是最流行的web伺服器,通過使用 mod_dav_svn 子產品,Apache可以通路版本庫,并且可以使用戶端使用HTTP的擴充協定WebDAV/DeltaV進行通路。(作者注:以下稱這種伺服器為“ApacheSVN伺服器”)
通過 Http 協定通路版本庫是 Subversion 的亮點之一。ApacheSVN伺服器具備了許多svnserve伺服器沒有的特性,使用上更加靈活,但是有一點難于配置,靈活通常會帶來複雜性。
由于 Subversion 需要版本化的控制,是以标準的 Http 協定不能滿足需求。要讓 Apache 與 Subversion 協同工作,需要使用 WebDAV(Web-based Distributed Authoring and Versioning:)Web 分布式創作和版本控制)。WebDAV 是 HTTP 1.1 的擴充,關于 WebDAV 的規範和工作原理,可以參考 IETF RFC 2518 (http://www.ietf.org/rfc/rfc2518.txt)。
一、必備條件
為了讓你的版本庫使用HTTP網絡,你必需具備以下幾個條件:
- 配置好httpd 2.2.x,并且使用mod_dav啟動。
- 為mod_dav安裝mod_dav_svn插件。
- 配置你的httpd.conf,使http協定能通路版本庫。
下面以我的配置過程詳細講解。
環境:
OS:Windows XP SP2
Web:Apache 2.2.6
SVN:svn-win32-1.4.6
二、安裝
1、安裝Apache
具體安裝方法見:《Windows下安裝Apache 2.2.x》
2、安裝 Subversion
将下載下傳下來的 svn-win32-1.4.6.zip 直接解壓即可,比如我解壓到 e:/subversion 。
從Subversion安裝目錄的 bin 子目錄将 intl3_svn.dll、libdb44.dll、mod_authz_svn.so、mod_dav_svn.so 拷貝到Apache的子產品目錄(Apache 安裝目錄的 modules 檔案夾)。
三、基本的Apache配置
修改Apache的配置檔案 httpd.conf ,使用LoadModule來加載mod_dav_svn子產品。
将:
#LoadModule dav_module modules/mod_dav.so
改成:
LoadModule dav_module modules/mod_dav.so
即去掉前面的“#”号。
添加:
LoadModule dav_svn_module modules/mod_dav_svn.so
一定确定它在 mod_dav 之後。
現在你已經設定了Apache和Subversion,但是Apache不知道如何處理Subversion用戶端,例如TortoiseSVN。為了讓Apache知道哪個目錄是用來作為Subversion版本庫,你需要使用編輯器(例如記事本)編輯Apache的配置檔案。
在配置檔案最後添加如下幾行:
<Location / repository>
DAV svn
SVNPath e:/svn/repos1
</Location>
這個配置告訴Apache首先需要啟用 dav_module,然後加載 dav_svn_module 。版本庫對外的URL是:http://伺服器IP/repository ,所有的Subversion版本庫在實體上位于e:/svn/repos1 。
配置完畢後重新啟動 Apache,打開浏覽器,輸入 http://伺服器IP/ repository 将會看到如下畫面:

這表示 Apache 的 dav_svn 子產品已經可以正常工作了。使用者可以使用任何一種 Subversion 的用戶端通過 Http 協定通路你的版本庫。
如果想要指定多個版本庫,可以用多個 Location 标簽,也可以使用 SVNParentPath 代替 SVNPath,例如在 e:/svn 下有多個版本庫 repos1,repos2 等等,用如下方式指定:
<Location /repository>
DAV svn
SVNParentPath e:/svn
</Location>
“SVNParentPath e:/svn ” 表示 e:/svn 下的每個子目錄都是一個版本庫。可以通過 http://伺服器IP/repository/repos1,http://伺服器IP/repository/repos2 來通路。
現在你的版本庫任何人都可以通路,并且有完全的寫操作權限。也就是說任何人都可以匿名讀取,修改,送出,以及删除版本庫中的内容(注:這時不需要配置E:/svn/repos/conf/svnserve.conf 檔案,并且也不需要啟動E:/subversion/bin/svnserve.exe。因為送出是通過Apache的dav子產品處理的,而不是由svnservice處理。)。我們用 TortoiseSVN 用戶端驗證即知。
顯然大部分場合這是不符合需求的。那麼如何進行權限設定呢,Apache 提供了基本的權限設定:
四、認證選項
1、基本 HTTP 認證
最簡單的用戶端認證方式是通過 HTTP 基本認證機制,簡單的使用使用者名和密碼來驗證一個使用者的身份。Apache提供了一個 htpasswd 工具來管理一個使用者檔案,這個檔案包含使用者名和加密後的密碼,這些就是你希望賦予 Subversion 特别權限的使用者。htpasswd 可以在 Apache 的 bin 安裝目錄下找到。具體使用方法如下:
建立使用者檔案:
htpasswd -c /etc/svn/passwordfile username
添加新使用者(-m 表示以 MD5 加密密碼):
htpasswd [-m] /etc/svn/passwordfile Newusername
更改使用者密碼:
htpasswd [-m] /etc/svn/passwordfile username
删除使用者(要用大寫的 D ):
htpasswd –D /etc/svn/passwordfile username
接下來修改 httpd.conf,在 Location 标簽中加入如下内容:
AuthType Basic
AuthName "svn repos"
AuthUserFile E:/usr/Apache2.2/bin/passwd
Require valid-user
說明:
AuthType Basic:啟用基本的驗證,比如使用者名/密碼對。
AuthName "svn repos":當一個認證對話框彈出時,出現在認證對話框中的資訊。(最好用英文,TortoiseSVN 不支援中文,安裝語言包除外。)
AuthUserFile E:/usr/Apache2.2/bin/passwd:指定E:/usr/Apache2.2/bin/passwd為使用者檔案,用來驗證使用者的使用者名及密碼。
Require valid-user:限定使用者隻有輸入正确的使用者名及密碼後才能通路這個路徑
重新啟動 Apache ,打開浏覽器通路版本庫。Apache 會提示你輸入使用者名和密碼來認證登陸了,現在隻有 passwd 檔案中設定的使用者才可以通路版本庫。也可以配置隻有特定使用者可以通路,替換上述 "Require valid-user" 為 "Require user tony robert" 将隻有使用者檔案中的 tony 和 robert 可以通路該版本庫。
有的時候也許不需要這樣嚴格的通路控制,例如大多數開源項目允許匿名的讀取操作,而隻有認證使用者才允許寫操作。為了實作更為細緻的權限認證,可以使用 Limit 和 LimitExcept 标簽。例如:
<LimitExcept GET PROPFIND OPTIONS REPORT>
require valid-user
</LimitExcept>
以上配置将使匿名使用者有讀取權限,而限制隻有 passwd 中配置的使用者可以使用寫操作。
如果這還不能滿足你的要求,你希望精确的控制版本庫目錄通路,可以使用 Apache 的 mod_authz_svn 子產品對每個目錄進行認證操作。
2、用 mod_authz_svn 進行目錄通路控制
首先需要讓 Apache 将 mod_authz_svn 子產品加載進來。在 Subversion 的安裝目錄中找到 mod_auth_svn 子產品,将其拷貝到 Apache 安裝目錄的 modules 子目錄下。修改 httpd.conf 檔案,添加:
LoadModule authz_svn_module modules/mod_authz_svn.so
現在可以在 Location 标簽中使用 authz 的功能了。一個基本的 authz 配置如下:
<Location /repository>
DAV svn
SVNParentPath e:/svn
# our access control policy
AuthzSVNAccessFile E:/usr/Apache2.2/bin/accesspolicy.conf
# try anonymous access first, resort to real
# authentication if necessary.
Satisfy Any
Require valid-user
# how to authenticate a user
AuthType Basic
AuthName "Subversion repository"
AuthUserFile E:/usr/Apache2.2/bin/passwd
</Location>
AuthzSVNAccessFile 指向的是 authz 的政策檔案,詳細的權限控制可以在這個政策檔案中指定。通路檔案 accesspolicy.conf 的文法與svnserve.conf和 Apache 的配置檔案非常相似,以(#)開頭的行會被忽略;在它的簡單形式裡,每一小節命名一個版本庫和一個裡面的路徑;認證使用者名是在每個小節中的選項名;每個選項的值描述了使用者通路版本庫的級别:r(隻讀)或者rw(讀寫),如果使用者沒有提到或者值留白,通路是不允許的; * 表示所有使用者,用它控制匿名使用者的通路權限;@符号區分組和使用者。如:
[groups]
committers = paulex, richard
developers = jimmy, michel, spark, sean
[/]
* = r
@committers = rw
[/branches/dev]
@developers = rw
[/tags]
tony = rw
[/private]
* =
@committers= r
使用 SVNParentPath 代替 SVNPath 來指定多個版本庫的父目錄時,其中所有的版本庫都将按照這個政策檔案配置。例如上例中 tony 将對所有版本庫裡的 /tags 目錄具有讀寫權限。如果要對具體每個版本庫配置,用如下的文法:
[groups]
project1_committers = paulex, richard
project2_committers = jimmy, michel, spark, tony, Robert
[repos1:/]
* = r
@ project1_committer = rw
[repos2:/]
* = r
@ project2_committer = rw
這樣 repos1的 project1_committer 組隻能對 repos1 版本庫下的檔案具有寫權限而不能修改版本庫 repos2 ,同樣 repos2 的 project2_commiter 組也不能修改 repos1 版本庫的檔案。
FAQ:
1、路徑或權限不足時将出現錯誤資訊提示:
http://localhost (路徑不對)
Error * PROPFIND request failed on '/' PROPFIND of '/': 200 OK (http://localhost)
http://localhost/svn (權限不足)
Error * PROPFIND request failed on '/svn' PROPFIND of '/svn': 403 Forbidden (http://localhost)
http://localhost/svn/repos (正常顯示)
http://localhost/repos (權限不允許)
Error * PROPFIND request failed on '/repos' PROPFIND of '/repos': 405 Method Not Allowed (http://localhost)
2、不啟動E:/subversion/bin/svnserve.exe ,但啟動了ApacheSVN ,通路(tortoiseSVN –> Repo – browser)或送出(SVN Commit)情形如下:
現象:svn://localhost/svn/repos 不能通路或送出,提示:Error * Can't connect to host 'localhost': 由于目标機器積極拒絕,無法連接配接。 但 file:///e:/svn/repos 和 http://localhost/svn/repos 可以通路或送出。
原因:svn:// 是獨立伺服器 svnserver 自己的協定。file:/// 是本地通路,即伺服器端和用戶端在一個機器上。
參考資料:
Subversion 官方網站:Subversion 的官方網站,提供最權威的介紹和最新的下載下傳。
Subversion 中文手冊:Subversion 簡體中文官方網站翻譯的中文手冊。
TortoiseSVN 中文文檔:Subversion 簡體中文官方網站翻譯的 TortoiseSVN 中文文檔。
我用 SVN 中文論壇:國内人氣非常旺的 SVN 中文交流論壇。
用 Apache 和 Subversion 搭建安全的版本控制環境:IBM 工程師寫的基于 Linux 的教程。
百度百科:由全體網民共同撰寫的百科全書
~ 全文完~
印第安
2007年12月23日23:37:41