天天看點

用 Apache 和 Subversion 搭建安全的版本控制環境(IBM)

2006 年 9 月 11 日

作為新一代的開源版本控制工具,Subversion 以其目錄版本化、原子送出、版本化的中繼資料、更加有效的分支和标簽等優良特性,正逐漸受到開源軟體社群的重視,并有望取代 CVS,成為開源軟體開發中版本控制的首選系統。在伺服器端,Subversion 最大的獨特之處,在于它可以通過一個擴充子產品與 Apache 的 HTTP 伺服器相結合,實作很多進階的管理功能和安全特性。與 CVS 相比,Subversion 實作了更加先進和安全的使用者認證功能。在 Apache 的支援下,使用者可以通過 HTTP 協定通路版本庫,管理者可以對使用者通路 HTTP 的權限做出具體的設定,同時 Subversion 還可以獲得 SSL 傳輸加密,使用者資料加密,以及目錄級的通路控制等特性。

本文将在伺服器端配置工作的角度,結合作者在實際開發工作當中的配置執行個體,介紹 Subversion 伺服器端的基本配置和管理,以及如何将 Subversion 與 Apache 結合,實作一些進階管理功能。

Subversion 簡介

在開源軟體的開發過程當中,由于開發方式自由和開發人員分散這些特性,版本控制問題一直是關系到項目成敗的重要問題。沒有版本控制系統的支援,開源軟體的開發過程就是混亂和不可控制的。

長 期以來,CVS 作為一種普遍采用的開源版本控制工具,在很多的開源軟體項目當中充當了重要的角色。在 Eclipse 當中,更是把 CVS 作為一個預設的插件,與 Ant,JUnit 等工具并列在一起,成為 Eclipse 軟體開發的基本工具。近年來,随着開源社群的發展,一種功能更加強大的開源版本控制工具逐漸進入了人們的視野,那就是 Subversion,憑借着更為優秀的特性,Subversion 正在逐漸取代 CVS,成為新一代的開源版本控制工具。

相 比 CVS,Subversion 中的目錄、檔案以及改名等中繼資料都是被版本化的,例如檔案的改名、拷貝等等操作;而且,在 Subversion 中,送出操作是不可分割的,修訂版本号是基于每次送出操作而非檔案;另外,Subversion 可以獨立運作,有着輕量級的分支(Branching)與标簽(Tagging)操作,版本庫可以采用資料庫(Berkeley DB)或者是使用特定格式的檔案進行存儲,對二進制檔案進行處理更為有效;最後,Subversion 工具以及相關插件都有着很好的國際化支援,可以支援包括簡體中文在内的多種語言版本,友善全球各地的開發人員。這些優秀的新特性,使得 Subversion 成為開源社群目前的最佳選擇。

對于普通使用者,即應用程式開發者而言,尤其是對 Eclipse 的使用者而言,Subversion 的使用十分的簡單。通過官方提供的 Eclipse 插件 Subclipse,使用者可以在 Eclipse 裡面很友善的使用 Subversion 用戶端的各項基本功能。具體的用戶端設定和使用方法,請參考 Subversion 官方網站和 Subclipse 官方網站。簡單說來,在 Eclipse 中使用 Subversion 插件的基本功能,如更新、送出、同步、分支等等,基本上同使用 Eclipse 自帶的 CVS 插件一模一樣,這樣,使用者就可以從 CVS 友善的轉移到 Subversion。

目前,Subversion 已經更新到 1.3.2 版本,相關下載下傳、特性說明和詳細使用手冊可以在 Subversion 首頁上找到。

簡單的版本庫管理

有了簡單易用的用戶端,大部分的使用者都可以輕松使用 Subversion 了,不過,作為伺服器端的管理人員,還必須進一步了解伺服器端的基本配置管理,才可以充分利用 Subversion 的各項優秀特性。

版本庫建立

Subversion 的版本庫(repository),就是位于伺服器端,統一管理和儲存資料的地方。本文中,我們以 Linux 為例,介紹在伺服器端配置和管理 Subversion 版本庫的基本方法。

要建立一個版本庫,首先要确定采用哪種資料存儲方式。在 Subversion 中,版本庫的資料存儲有兩種方式,一種是在 Berkeley DB 資料庫中存放資料;另一種是使用普通檔案,采用自定義的格式來儲存,稱為 FSFS。

兩種存放方式各有優缺點,讀者可以參考 http://svnbook.org/ 上面的文檔來了解兩者詳細的比較和差別,這裡,我們僅引用上述文檔當中的簡單對照表,給出一個簡明的比較。

表1 兩種版本庫資料存儲對照表

特性 Berkeley DB FSFS
對操作中斷的敏感 很敏感;系統崩潰或者權限問題會導緻資料庫“塞住”,需要定期進行恢複。 不敏感
可隻讀加載 不能 可以
存儲平台無關 不能 可以
可從網絡檔案系統通路 不能 可以
版本庫大小 稍大 稍小
擴充性:修訂版本樹數量 無限制 某些本地檔案系統在處理單一目錄包含上千個條目時會出現問題。
擴充性:檔案較多的目錄 較慢 較慢
檢出最新代碼的速度 較快 可以
大量送出的速度 較慢,但時間被配置設定在整個送出操作中 較快,但最後較長的延時可能會導緻用戶端操作逾時
組通路權處理 對于使用者的 umask 設定十分敏感,最好隻由一個使用者通路。 對 umask 設定不敏感
功能成熟時間 2001 年 2004 年

确定了具體的資料存儲類型,隻要在指令行當中執行

svnadmin

指令就可以建立一個 Subversion 版本庫,指令如下

# 建立檔案夾

            $ mkdir /etc/svn/

            $ mkdir /etc/svn/repos

            # 運作建立版本庫的指令,指定資料存儲為 FSFS,如果要指定為 Berkeley DB,則将 fsfs 替換為 bdb

            $ svnadmin create --fs-type fsfs /etc/svn/repos
      

如果一切正常,指令執行後不會有任何回報資訊而迅速傳回,這樣,一個新的版本庫就被建立出來了。我們來檢視一下生成的版本庫結構:

$ ls -l /etc/svn/repos

            總用量 56

            drwxrwxr-x  2 robert robert 4096  8月 27 17:27 conf

            drwxrwxr-x  2 robert robert 4096  8月 27 17:27 dav

            drwxrwsr-x  5 robert robert 4096  8月 27 17:27 db

            -r--r--r--  1 robert robert    2  8月 27 17:27 format

            drwxrwxr-x  2 robert robert 4096  8月 27 17:27 hooks

            drwxrwxr-x  2 robert robert 4096  8月 27 17:27 locks

            -rw-rw-r--  1 robert robert  229  8月 27 17:27 README.txt
      

其 中,conf 目錄下存放了版本庫的配置檔案,包括使用者通路控制和權限控制等内容,檔案本身的注釋說明十分詳細,讀者可以根據注釋自行配置;dav 目錄是提供給 Apache 相關子產品的目錄,目前為空;db 目錄下存放着 Subversion 所要管理的所有受版本控制的資料,不同的存儲方式(Berkeley DB 或者 FSFS)下有着不同的目錄結構,不過我們一般不用直接修改和檢視這個目錄下的内容,Subversion 的指令可以安全的操作這個目錄;另外,hooks 目錄存放着鈎子腳本及其模版(一種版本庫事件觸發程式),locks 目錄存放着 Subversion 版本庫鎖定資料,format 檔案記錄了版本庫的布局版本号。

項目添加

有了建立的版本庫,就可以往裡面添加項目了。不過,管理者必須考慮的問題是,應該将每一個項目分别放在不同的版本庫裡面,還是應該将它們放在統一的 版本庫裡面。統一的版本庫可以讓管理者更加容易的更新和備份,不過,由于通路權限控制是針對整個版本庫的,是以,統一的版本庫也為不同項目配置不同的通路 權限帶來了麻煩。是以,管理者應該根據實際情況權衡考慮。

我們以統一的版本庫為例,添加兩個項目 project_luni 和 project_test。要做到這個,最好的辦法就是用

svn import

指令導入已有的目錄樹。

首先,我們在一個臨時目錄下,根據 Subversion 版本控制的一般布局結構,建立出兩個項目的主要目錄樹,如下:

/etc/svn/tmp					

            |

            ――project_luni					

            |	|

            |	――branches

            |	|

            |	――tags

            |	|

            |	――trunk

            |					

            ――project_test

            |

            ――branches

            |

            ――tags

            |

            ――trunk
      

然後,用

svn import

指令來進行項目的導入:

$ svn import /etc/svn/tmp/ file:///etc/svn/repos/ --message "init"

            新增           /etc/svn/tmp/project_test

            新增           /etc/svn/tmp/project_test/trunk

            新增           /etc/svn/tmp/project_test/branches

            新增           /etc/svn/tmp/project_test/tags

            新增           /etc/svn/tmp/project_luni

            新增           /etc/svn/tmp/project_luni/trunk

            新增           /etc/svn/tmp/project_luni/branches

            新增           /etc/svn/tmp/project_luni/tags

            送出後的修訂版為 1。
      

版本庫檢視

作為版本庫管理者,我們經常需要檢視 Subversion 版本庫的狀況,這就需要一些“隻讀”的檢視工具。

在上述項目導入完成以後,我們可以用

svn list

确認導入的項目是否正确:

$ svn list --verbose file:///etc/svn/repos/

            1 robert                 8月 27 18:24 project_luni/

            1 robert                 8月 27 18:24 project_test/
      

另外,如果要檢視最新修訂版本的資訊,可以使用

svnlook info

指令:

$ svnlook info /etc/svn/repos/

            robert

            2006-08-27 18:24:27 +0800 (日, 27  8月 2006)

            0
      

指令輸出了這個版本庫的最新修訂版本資訊,包括作者、時間、日志字數和日志内容等。除開最新修訂版以外,我們還可以在指令後面接上

“--revision 版本号”

來指定某一個修訂版的顯示。

另外,我們還可以用如下指令來顯示版本庫的具體樹形結構,後面的

“--show-ids”

選項指定顯示每一個顯示元素的修改版本 ID。

$ svnlook tree /etc/svn/repos/ --show-ids

            / <0.0.r1/1007>

            project_test/ <1.0.r1/333>

            trunk/ <2.0.r1/0>

            branches/ <3.0.r1/74>

            tags/ <4.0.r1/152>

            project_luni/ <5.0.r1/793>

            trunk/ <6.0.r1/454>

            branches/ <7.0.r1/530>

            tags/ <8.0.r1/609>
      

其他

這裡有一個需要新手,尤其是習慣了 Subversion 用戶端指令

“svn”

的使用者注意的問題,那就是,

“svnadmin”

“svnlook”

都被認為是伺服器端的管理工具,隻被用于版本庫所在的機器,用來檢查和維護版本庫,不能通過網絡來執行任務。是以,試圖将 URL 甚至本地 file 路徑傳遞給這兩個程式,都是錯誤的。

Subversion 還有很多管理工具可供管理者應用,需要了解這項工具的使用方法,讀者們可以用

svn help

,

svnadmin help

,

svnlook help

等等指令檢視幫助資訊,另外,Subversion 參考手冊提供了更為全面和詳細的使用介紹。

基本的伺服器配置

Subversion 設計了一個抽象的網絡層,版本庫建立完畢之後,可以通過各種伺服器向外公布。svnserve 是 Subversion 自帶的一個小型的伺服器,它使用獨立的協定與用戶端。我們可以通過

svnserve –i
      

作為 inetd 啟動或者

svnserve –d
      

作為守護程序啟動一個服務。伺服器啟動後,用戶端即可以通過絕對路徑通路。如上例可以通路

svn://伺服器IP/etc/svn/repos

。同時可以指定一些選項,常用的如

-r

,用來指定版本庫的根路徑,例如假設版本庫位于 /etc/svn/repos:

svnserve –d -r /etc/svn
      

則用戶端可以通過如下 URL 通路伺服器:

svn://伺服器IP/repos

, 這樣可以有效的避免暴露本地路徑。另外如

--listen-port

--listen-host

可以指定綁定的位址和端口,

-R

可以強制設定為 Read-Only 模式。如果在 Windows 作業系統下,可以将版本庫設定在 C 分區,如

c:"svnroot"repos

可以通過

svn://伺服器IP/svnroot/repos通路

,如果在其他分區,就必須要通過

-r

選項來指定 root 位置。

svnserve 可以通過配置 svnserve.conf 來進行一些簡單的通路權限控制。你可以在版本庫的 conf 子檔案夾下發現這個檔案。檔案的初始内容大緻如下:

[general]

            # anon-access = read

            # auth-access = write

            password-db = passwd

            # authz-db = authz

            # realm = My First Repository
      

其中

anon-access

表示匿名使用者的權限,

auth-access

表示認證使用者的權限設定,

password-db

指向儲存使用者帳号密碼的檔案的位置,可以使用相對路徑。svnserve 隻能對全局提供簡單的通路控制,如果想要更加靈活的方式,可以使用 Apache Http Server 作為向外公布版本庫的方式。

與 Apache Http Server 的結合

通過 Http 協定通路版本庫是 Subversion 的亮點之一。使用 Http 協定意味着隻需要打開浏覽器,輸入 URL 即可輕松的浏覽整個版本庫。靈活通常帶來複雜性,Http 方式相對于 svnserve 方式來說需要更多的配置。

由 于 Subversion 需要版本化的控制,是以标準的 Http 協定不能滿足需求。要讓 Apache 與 Subversion 協同工作,需要使用 WebDAV(Web 分布式創作和版本控制)。WebDAV 是 HTTP 1.1 的擴充,關于 WebDAV 的規範和工作原理,可以參考 IETF RFC 2518。

為 了使 Subversion 與 dav 子產品通信,需要安裝 mod_dav_svn 插件,可以在 Subversion 的安裝目錄中找到。将其拷貝到 Apache 安裝目錄的 modules 檔案夾下。接下來就是配置 Apache 的 httpd.conf 檔案,讓 Apache 在啟動的時候加載上述子產品。

需要添加的内容如下:

LoadModule dav_module modules/mod_dav.so

            LoadModule dav_svn_module modules/mod_dav_svn.so

            <Location /repos>

            DAV svn

            SVNPath /etc/svn/repos

            </Location>
      

首先需要啟用 dav_module,然後加載 dav_svn_module。Location 标簽指出通路的 URL 以及在伺服器上的實際位置。配置完畢後重新啟動 Apache,打開浏覽器,輸入

http://伺服器IP/repos

将會看到如下畫面:

圖1. 一個初始版本庫

用 Apache 和 Subversion 搭建安全的版本控制環境(IBM)

這表示 Apache 的 dav_svn 子產品已經可以正常工作了。使用者可以使用任何一種 Subversion 的用戶端通過 Http 協定通路你的版本庫。

如果想要指定多個版本庫,可以用多個 Location 标簽,也可以使用 SVNParentPath 代替 SVNPath,例如在

/etc/svn

下有多個版本庫 repos1,repos2 等等,用如下方式指定:

<Location /repos>

            DAV svn

            SVNParentPath /etc/svn

            </Location>
      

"SVNParentPath /etc/svn" 表示 /etc/svn 下的每個子目錄都是一個版本庫。可以通過

http://伺服器IP/repos/repos1

http://伺服器IP/repos/repos2

來通路。

現在你的版本庫任何人都可以通路,并且有完全的寫操作權限。也就是說任何人都可以匿名讀取,修改,送出,以及删除版本庫中的内容。顯然大部分場合這是不符合需求的。那麼如何進行權限設定呢,Apache 提供了基本的權限設定:

首先需要建立一個使用者檔案。Apache 提供了一個工具 htpasswd,用于生成使用者檔案,可以在 Apache 的安裝目錄下找到。具體使用方法如下:

htpasswd etc/svn/passwordfile username
      

如果 passwordfile 不存在,可以加上

-c

選項讓 htpasswd 建立一個。建立好的檔案内容是使用者名加上密碼的 MD5 密文。

接下來修改 httpd.conf,在 Location 标簽中加入如下内容:

AuthType Basic

            AuthName "svn repos"

            AuthUserFile /etc/svn/passwordfile

            Require valid-user
      

重新啟動 Apache, 打開浏覽器通路版本庫。Apache 會提示你輸入使用者名和密碼來認證登陸了,現在隻有 passwordfile 檔案中設定的使用者才可以通路版本庫。也可以配置隻有特定使用者可以通路,替換上述 "Require valid-user" 為 "Require user tony robert" 将隻有 tony 和 robert 可以通路該版本庫。

有的時候也許不需要這樣嚴格的通路控制,例如大多數開源項目允許匿名的讀取操作,而隻有認證使用者才允許寫操作。為了實作更為細緻的權限認證,可以使用 Limit 和 LimitExcept 标簽。例如:

<LimitExcept GET PROPFIND OPTIONS REPORT>

            require valid-user

            </LimitExcept>
      

如上配置将使匿名使用者有讀取權限,而限制隻有 passwordfile 中配置的使用者可以使用寫操作。如果這還不能滿足你的要求,可以使用 Apache 的 mod_authz_svn 子產品對每個目錄進行認證操作。

用 mod_authz_svn 進行目錄通路控制

首先需要讓 Apache 将 mod_authz_svn 子產品加載進來。在 Subversion 的安裝目錄中找到 mod_auth_svn 子產品,将其拷貝到 Apache 安裝目錄的 modules 子目錄下。修改 httpd.conf 檔案,找到

LoadModule dav_svn_module modules/mod_dav_svn.so
      

在其後面加上

LoadModule authz_svn_module modules/mod_authz_svn.so
      

現在可以在 Location 标簽中使用 authz 的功能了。一個基本的 authz 配置如下:

<Location /repos>

            DAV svn 

            SVNPath /etc/svn/repos 

            AuthType Basic 

            AuthName "svn repos" 

            AuthUserFile /etc/svn/passwd 

            AuthzSVNAccessFile /etc/svn/accesspolicy

            Satisfy Any 

            Require valid-user 

            </Location>
      

AuthzSVNAccessFile 指向的是 authz 的政策檔案,詳細的權限控制可以在這個政策檔案中指定,如:

#兩個分組:committers,developers

            [groups] 

            committers = paulex richard

            developers = jimmy michel spark sean " 

            steven tony robert

            #在根目錄下指定所有的使用者有讀權限

            [/] 

            * = r 

            #追加 committers 組使用者有讀寫權限

            @committers = rw 

            #在 branches/dev 目錄下指定 developers 組的使用者有讀寫權限

            [/branches/dev] 

            @developers = rw 

            #在 /tags 組下給予使用者 tony 讀寫權限	

            [/tags] 

            tony = rw 

            #禁止所有使用者通路 /private 目錄

            [/private] 

            * = 

            #給 committers 組使用者讀權限

            @committers= r
      

使用 SVNParentPath 代替 SVNPath 來指定多個版本庫的父目錄時,其中所有的版本庫都将按照這個政策檔案配置。例如上例中 tony 将對所有版本庫裡的 /tags 目錄具有讀寫權限。如果要對具體每個版本庫配置,用如下的文法:

[groups] 

            project1_committers = paulex richard

            project2_committers = jimmy michel spark sean " 

            steven tony robert

            [repos1:/] 

            * = r 

            @ project1_committer = rw 

            [repos2:/] 

            * = r 

            @ project2_committer = rw 
      

這樣項目1的 committer 組隻能對 repos1 版本庫下的檔案具有寫權限而不能修改版本庫 repos2,同樣項目2的 commiter 也不能修改 repos1 版本庫的檔案。

用 MySQL 代替檔案形式存放密碼

到目前為止我們的使用者名密碼檔案還是以文本檔案形式存放在檔案系統中的,出于安全性的需要或者單點登陸等可擴充性的考慮,文本檔案的管理方式都不能 滿足需求了。通過 Apache 的 module_auth_mysql 子產品,我們可以用 MySQL 來儲存使用者資訊。該子產品的首頁在 http://modauthmysql.sourceforge.net/,你也可以在 http://modules.apache.org/ 找到它的發行版本。安裝方法同上述 Apache 的子產品一樣,拷貝至 modules 目錄并在 httpd.conf 檔案中添加如下語句:

LoadModule mysql_auth_module modules/mod_auth_mysql.so
      

相應的 Location 區域改寫為:

<Location /repos> 

            AuthName "MySQL auth" 

            AuthType Basic 

            AuthMySQLHost localhost 

            AuthMySQLCryptedPasswords Off

            AuthMySQLUser root

            AuthMySQLDB svn 

            AuthMySQLUserTable users

            require valid-user 

            </Location>
      

然後在 mysql 中添加名為 svn 的資料庫,并建立 users 資料表:

create database svn;

            use svn;

            CREATE TABLE users (

            user_name CHAR(30) NOT NULL,

            user_passwd CHAR(20) NOT NULL,

            user_group CHAR(10),

            PRIMARY KEY (user_name)

            );
      

在 users 表中插入使用者資訊

insert into users values('username','password','group');
      

重新啟動 Apache,在通路版本庫的時候 Apache 就會用 mysql 資料表中的使用者資訊來驗證了。

用 SSL 實作安全的網絡傳輸

通過 Apache 的網絡連結,版本庫中的代碼和資料可以在網際網路上傳輸,為了避免資料的明文傳輸,實作安全的版本控制,需要對資料的傳輸進行加密。Apache 提供了基于 SSL 的資料傳輸加密子產品 mod_ssl,有了它,使用者就可以用 https 協定通路版本庫,進而實作資料的加密傳輸了。SSL 協定及其實作方式,是一個非常複雜的話題,本文隻是介紹 Apache 提供的最基本的SSL配置方法,更加詳細的介紹内容,請參考 http://httpd.apache.org/docs-2.0/ssl/ 上的文檔。

開始配置前,我們需要一個實作 Apache 中 SSL 子產品的動态程式庫,通常名為 mod_ssl.so,及其配置檔案,通常名為 ssl.conf。這個實作是跟 Apache 的版本相關的,不比對的版本是不能用的;而且,并不是每一個 Apache 的版本都自帶了相關實作檔案,很多情況下,我們需要自己去搜尋相關檔案。另外,我們還需要 OpenSSL 軟體及其配置檔案,來生成加密密鑰和數字證書。這裡,我們可以使用一些免費網站,如 http://hunter.campbus.com/ 上提供的內建版本的 Apache。

有了相關的工具和檔案,我們就可以開始生成 SSL 的證書和密鑰了。首先,我們需要找到 openssl 程式及其配置檔案 openssl.cnf,運作如下指令來生成 128 位的 RSA 私有密鑰檔案

my-server.key:

            openssl genrsa -des3 -out my-server.key 1024

            Loading 'screen' into random state - done

            Generating RSA private key, 1024 bit long modulus

            .....++++++

            ........++++++

            e is 65537 (0x10001)

            Enter pass phrase for server.key:********

            Verifying - Enter pass phrase for server.key:********
      

指令運作期間需要使用者輸入并确認自己的密碼。

現在,我們需要 SSL 的認證證書,證書是由 CA(certificate authority) 發放并且認證的。為此,我們可以用如下指令生成一個 CSR(Certificate Signing Request) 檔案發給 CA,進而得到 CA 的認證:

openssl req -new -key my-server.key -out my-s erver.csr -config openssl.cnf
      

當然,一般情況下,如果 Subversion 的使用者不是太多,安全情況不是很複雜,我們也可以生成一個自簽名的認證證書,進而省去了向 CA 申請認證的麻煩。如下指令:

openssl req -new -key my-server.key -x509 -out my-server.crt -config openssl.cnf
      

以上兩個指令都需要使用者輸入那個 key 檔案的密碼,以及一些網絡設定資訊,如域名,郵箱等等,這裡輸入的伺服器域名應該與 Apache 配置檔案當中的一緻。現在,我們可以在 Apache 的 conf 目錄下建立一個 ssl 目錄,将 my-server.key 和 my-server.crt 檔案都移動到 ssl 目錄裡面。然後修改 ssl.conf 檔案,将 SSLCertificateKeyFile 和 SSLCertificateFile 項指向這兩個檔案。

如果 Apache 的 module 目錄裡面沒有 mod_ssl.so 檔案,可以将事先準備好的檔案拷貝過去。然後,我們可以設定 Apache 的配置檔案 httpd.conf,将 ssl 子產品加入其中:

LoadModule ssl_module modules/mod_ssl.so
      

然後,在配置檔案的最後,加上如下 SSL 相關配置項:

SSLMutex default

            SSLRandomSeed startup builtin

            SSLSessionCache none


            ErrorLog logs/SSL.log

            LogLevel info

            <VirtualHost svntest.ut.cn.ibm.com:443>

            SSLEngine On

            SSLCertificateFile conf/ssl/my-server.crt

            SSLCertificateKeyFile conf/ssl/my-server.key

            </VirtualHost>
      

這樣,基本的設定工作就完成了。重新啟動 Apache 伺服器,現在可以用 https 協定代替 http 協定來通路版本庫了。如果要限定版本庫隻能用 https 通路,我們可以在 Apache 配置檔案當中 Subversion 部分加上 “SSLRequireSSL”。如下:

<Location /repos>

            DAV svn 

            SVNPath /etc/svn/repos

            ………….#other items

            SSLRequireSSL 

            </Location>
      

總結

Subversion 以其優良的版本控制功能,靈活的網絡通路模型,以及與 Apache 伺服器聯合配置所帶來的更強大的管理控制功能,逐漸在開源軟體開發的實踐當中得到廣泛的應用。本文重點介紹了 Subversion 伺服器端的配置以及與 Apache 伺服器聯合配置的基本步驟和簡單應用,實作了簡單的執行個體應用。讀者如果想要進一步了解相關資訊,請參考文章後面列出的相關資料。

參考資料

  • Subversion 官方網站:Subversion 的發源地,提供最權威的介紹和最新的下載下傳。
  • Subclipse 官方網站:Subversion 配套的插件站點,提供 Eclipse 中 Subversion 的插件下載下傳和文檔。
  • Subversion 手冊:官方提供的全面而細緻的使用說明書。
  • IETF RFC 2518 WebDAV 的規範和工作原理的原始文檔。
  • Subversion 簡介:developerWorks Java 專區中的一篇介紹 Subversion 用戶端插件使用方法的文章 (Elliotte Harold,developWorks 2006 年 7 月 06 日)。
  • 用 Subversion 建構版本控制環境 :developerWorks Java 專區中的一篇介紹 Subversion 用戶端安裝,配置,插件使用的文章 (劉冬,developWorks 2005 年 9 月)