天天看點

SVN+APACHE總結

 Subversion是一個自由、開放源碼的版本控制系統。它是一個通用系統,可用來管理任何類型的檔案,其中包括程式源碼。 

    它的初始目标很明确,實作絕大部分CVS的已有功能;充分考慮現有的CVS使用者,在使用方式上模仿CVS,同時開發了一系列工具,使得基于CVS的項目能夠順利遷移到Subversion上。和CVS相比,它有很多優點,例如目錄版本控制、不可分割的送出、一緻的資料處理方式和更有效率的分支與标記等。。。

Subversion有兩種運作方式,一種是基于Apache Http Server,另外一種是Subversion Standalone Server。下面我講解的是基于Apache Http Server的Subversion,這樣做幾個好處:A.能使用WebDAV協定。B.能使用浏覽器作為用戶端工具浏覽源碼倉庫。C.可以很容易的支援到SSPI(Windows域認證)和LDAP(AD?),這些都是Apache本身就支援的。D.能得到比較完善的Apache安全認證系統,比如SSL加密連接配接。

安裝Subversion:

1.到www.apache.org上下載下傳apache http server,注意要下載下傳2.0.X以上的版本(但是不能是2.2.X版本的,SVN1.4系列的不能和2.2系列結合),否則不能和目前最新的Subversion工作。

2.到http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91上下載下傳Subversion目前1.4.5版本的二進制安裝檔案,一般tigris.org并不提供二進制包,這些二進制包是有一些志願者維護的,是以可能不是目前最新的版本。如果你想嘗鮮使用Subversion的最新版,請下載下傳源碼自己編譯。

3.安裝apache http server

4.安裝Subversion

5.檢查$\apache group\apache2\modules下是不是已經有了mod_dav_svn.so和mod_authz_svn.so

6.檢查$\apache group\apache2\modules下是不是已經有了libdb42.dll。

7.搜尋$\apache group\apache2\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,然後再安裝Subversion,這樣上述5,6,7步驟都可以免了,在安裝Subversion過程中它會自動拷貝相應檔案到相應目錄中,并且修改http.conf檔案,然後重新啟動apache服務使修改生效。但是我發現現在這個版本的Subversion安裝檔案可能有個bug,apache的http.conf的配置檔案中#LoadModule dav_fs_module modules/mod_dav_fs.so注釋沒有去掉,是以大家還是小心檢查一下。如果你是先安裝的Subversion,然後再安裝的Apache的,那麼上述的步驟一個也不能漏,都需要自己手動完成。

配置Subversion:

1.在硬碟上建立源碼庫的根目錄,例如F:\SVN

2.在E:\SVN之下建立一個新的目錄,例如SVN作為我們的測試源碼庫

3.建立Subversion資料庫,目前版本Subversion支援兩種格式資料庫,一種是FSFS,另外一種是BDB( Berkeley Database)。在指令行下輸入svnadmin create --fs-type bdb TestRepository建立BDB格式的資料庫(確定目前目錄已經切換到E:\SVN\),在指令行下輸入svnadmin create --fs-type fsfs TestRepository建立FSFS格式的資料庫(確定目前目錄已經切換到E:\SVN\)。建好資料庫以後,到E:\SVN\TestRepository下看看是不是多了很多目錄和檔案,可以研究一下這些檔案,對了解Subversion有幫助,但是不要試圖直接修改這些檔案!

4.打開$\apache group\apache2\conf\httpd.conf配置檔案,在檔案的末尾加入以下語句,

<Location /svn>

DAV svn

SVNParentPath "F:\svn"

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile "C:\Program Files\Apache Group\Apache2\bin\passwd"

AuthzSVNAccessFile "C:\Program Files\Apache Group\Apache2\bin\svnaccessfile"

Require valid-user

</Location>

這裡建立了一個虛拟目錄http://yourServer/svn/,所有的Subversion源碼倉庫都在這個虛拟目錄中,并且使用“passwd”檔案中username/password(使用者名/密碼)清單通路http://yourServer/svn/。關于Subversion的安全配置是一個比較重要的部分,我會留到下次配置SSL加密連接配接再講。

5.在指令行下切換到$\apache group\apache2,執行bin\htpasswd -c passwd <username>,這裡<username>是你想要加入的使用者名,比如shenmin。執行這個指令成功以後就會在bin目錄下建立一個passwd檔案,之後如果再加入新的使用者和更改已有使用者的密碼,執行bin\htpasswd passwd <username>即可。

6.重新開機Apache服務

7.在浏覽器位址欄中輸入 http://YourServer/svn/TestRepository,輸入使用者名密碼,ok。Subversion現在已經可以正常工作了。

今天接着昨天的内容講Subversion的安全配置。在上一講中我們在Apache的httpd.conf檔案裡加入了這樣一節:

<Location /svn>

DAV svn

SVNParentPath "F:\svn"

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile "C:\Program Files\Apache Group\Apache2\bin\passwd"

AuthzSVNAccessFile "C:\Program Files\Apache Group\Apache2\bin\svnaccessfile"

Require valid-user

</Location>

    下面我來解釋一下這些配置資訊用途:

<Location /svn> 說明我們所有的代碼倉庫在/svn這個虛拟目錄下
DAV svn 說明Apache會使用svn這個module來解析這個虛拟目錄
SVNParentPath e:\SVN 說明所有的代碼倉庫都在本地硬碟的e:\SVN下
AuthType Basic 使用最基本的認證校驗,使用者名/密碼
AuthName "Subversion repositories" 說明在認證對話框彈出的時候,對話框的标題顯示,你可以把它修改成你想要的任何提示資訊,比如:AuthName "Warning"等等
AuthUserFile passwd 說明我們使用的access list檔案的名字,在上一講中我們建立的檔案名字是passwd,是以這裡是passwd。如果你建立的檔案名字是其他的,這裡要作相應的改動
AuthzSVNAccessFile 說明svn自己控制的access list檔案,這個檔案很重要,可以豐富svn的安全配置,在下面會講到
Require valid-user 說明隻有輸入正确的使用者名/密碼才能通路

上述的配置隻能是最簡單的安全配置,如果你想擁有更強大的安全配置,就需要加入一些東西了。比如:

  1. 如果你想讓所有的匿名使用者能通路代碼倉庫,對某些特定使用者才開放可寫的權限,則需要把 

    Require valid-user

    改成

    <LimitExcept GET PROPFIND OPTIONS REPORT>

    Require valid-user

    </LimitExcept>

  2. 如果你對于代碼倉庫裡面某些目錄還有更細緻的通路控制,隻用passwd就沒辦法啦,這個時候我們就需要AuthzSVNAccessFile檔案了,去掉#AuthzSVNAccessFile svnaccessfile這一行前面的注釋。Apache首先會使用passwd校驗使用者名和密碼,然後會認證資訊傳給Subversion的AuthzSVNAccessFile子產品,由這個子產品作更進一步的權限控制。首先我們來建立一個檔案svnaccessfile,内容如下:

    [groups]

    developers = shenmin

    docs = shenrui

    #to allow everyone read access

    [/]

    * = r

    #allow all developers complete access

    @developers = rw

    #give the doc people write access to the docs folder

    [test:/]

    @docs = r

    @developers = rw

  3. 首先我們定義了兩個group,一個是developer,代表開發組,另外一個是docs,代表文檔撰寫組,然後

    [/]

    * = r

    意思是對于所有的使用者開放可讀的權限。注意這裡的[/],表示是對根目錄下的所有代碼倉庫賦予權限。接着是

    @developers = rw

    [test:/]

    @docs=rw                                                                                                                                                                                                                                                                  這這裡的@應該代表的是group的意思(這個還沒有确認,是我自己猜測的,因為如果是直接給單一使用者賦予權限,則不需要前面的@,注意這裡對于docs這個組,我們一樣指定了目錄路徑,而不是對于整個代碼倉庫。

    這裡再說說SVNParentPath,配置了SVNParentPath,以後每次在根目錄下面加入新的repository就不需要再重新配置Subversion和Apache了,自動擷取了根目錄的配置資訊,很友善。然而這也引發了另外一個問題,當你在浏覽器位址欄裡輸入http://youserver/svn/的時候,伺服器會報錯,提示你沒有權限通路通路這個url,我們想要的效果是浏覽到這個url時能夠把根目錄下的所有的repository列出來。完成這個工作需要寫點代碼了,使用的工具可以是很多,這裡使用php,當然我想用perl或者python一定是沒有問題。首先要安裝php,使apache支援php。