天天看點

Windows下架設Subversion伺服器前 言基本概念安裝配置

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網絡,你必需具備以下幾個條件:

  1. 配置好httpd 2.2.x,并且使用mod_dav啟動。
  2. 為mod_dav安裝mod_dav_svn插件。
  3. 配置你的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 将會看到如下畫面:

Windows下架設Subversion伺服器前 言基本概念安裝配置

這表示 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