Subversion: 用 Apache2 作为 Subversion 的服务平台

我以前一直是用 Svnserve 做为 Subversion 服务器。这样简单易行,而且访问速度也不错。

但 Svnserve 做服务器有几个不足之处:
1、权限管理太简单,只能为整个仓库设置访问权限,不能为目录设置访问权限;
2、访问用户的密码以明文形式保存在文本文件里面;
3、只能提供一个仓库,如果要提供多个仓库,就必须启动多个 Svnserve 实例;
4、Svnserve.exe 必须借助第三方工具软件(例如 FireDaemon)才能安装为 Windows 系统服务;
5、必须在防火墙上打开单独的端口,而不能直接通过 HTTP 协议访问。

而换成用 Apache2 作为 Subversion 的服务平台,具有下列好处:
1、可以为每个仓库、目录设置访问权限;
2、密码采用 MD5 或者 Crypt 加密存储,并可以利用其他验证方式;
3、可以同时服务多个 Subversion 仓库;
4、通过 HTTP 协议即可访问仓库,几乎不会受到防火墙影响;
5、可以通过浏览器直接浏览、下载文件;
6、任何支持 WebDAV 的软件都可以操作 Subversion 仓库。

废话不说了,安装步骤如下:

第一步:安装 Apache2
很遗憾,必须使用 Apache2,而不能是 Apache1 或者 IIS。如果你的系统正在使用 IIS 或者 Apache1,那么可以将 Apache2 绑定到其他端口,例如 8080。这只需要修改 httpd.conf 的 Listen 80 为 Listen 8080 (注意去掉该行前面的 # 注释符号) 即可。

第二步:集成 Subversion 到 Apache2 中
修改 httpd.conf,加入下面两行:
LoadModule dav_svn_module d:/svn-1.2.0-win32/bin/mod_dav_svn.so
LoadModule dav_svn_module d:/svn-1.2.0-win32/bin/mod_authz_svn.so

第三步:创建仓库
在命令行窗口运行:
d:/svn-1.2.0-win32/bin/svnadmin create d:/svnrepo
然后继续修改 httpd.conf,加入下面的内容:

<Location /public>
    DAV svn
    SVNPath d:/svnrepo
</Location>

现在启动 Apache2,通过浏览器访问
http://127.0.0.1:8080/public/
应该就可以看到如下画面了。当然了,如果你的仓库里面什么都没有,就只能看到一个空目录而已。

第四步:权限验证
经过前面三个步骤,我们建立了一个任何人都可以访问并操作的 Subversion 仓库。所以现在就是该为这个仓库加上锁的时候了。

修改 httpd.conf,找到刚刚输入的 ,修改为如下内容:

<Location /public>
    DAV svn
    SVNPath d:/svnrepo
    
    AuthzSVNAccessFile "d:/svn-1.2.0-win32/conf/repo-access-file"
    
    Satisfy Any
    Require valid-user

    AuthType Basic
    AuthName "我的 Subversion 仓库"
    AuthUserFile "d:/svn-1.2.0-win32/conf/auth-file"
</Location>

这里我们指定了两个文件。repo-access-file 文件用于指定仓库的访问策略,auth-file 则保存用户名和密码。

repo-access-file 文件的内容如下:

[/]
dualface = rw
* = r

[/private]
dualface = rw

这个文件里面,[/] 表示要为根目录指定访问策略,而 [/private] 则表示为 /private 目录指定访问策略。
[/] 后面的 dualface = rw 表示名为 dualface 的用户在这个目录及其子目录中具有读写权限(r = 读,w = 写)。* = r 则表示任何用户都具有只读权限。[/private] 后面没有 * = r,因此除了 dualface 以外的任何其他用户都无法访问这个目录。
这里要注意的是,虽然我们为 / 根目录指定的访问策略是允许任何人具有只读权限,但 /private 目录单独的访问策略具有更高的优先级。

接下来,还要创建保存用户名和密码的 auth-file 文件。这个文件不能直接建立,需要使用 Apache2 的 htpasswd 程序来建立。使用格式如下:
htpasswd -cm d:/svn-1.2.0-win32/conf/auth-file dualface

-cm 参数表示创建文件,并添加用户。而 dualface 则是要添加的用户名。执行命令后,htpasswd 会提示输入两次为用户指定的密码。


如果要添加更多用户,将参数 -cm 改为 -m 即可。最后重新启动 Apache2,如果一切顺利,我们的仓库就完全建立好了!

dualface 发表于 2005 年 06 月 04 日 @
所有评论

您好,拜读大作,深受启发。但还有点问题不清楚,望不吝赐教

我在Apache中设置参数如下:
<Location /svn>
DAV svn
SVNParentPath F:/svn

AuthzSVNAccessFile "F:\svn\auth\access.file"

Satisfy Any
Require valid-user

AuthType Basic
AuthName "认证密码"
AuthUserFile "F:\svn\auth\user.file"
</Location>

现F:\svn下面有子目录Transfer。
我在access.file中设置为:

[/Transfer]
test=r

使用http://localhost/svn/Transfer/访问。test用户并不能登录。
而非要设置成为
[/]
test=r

test用户才可以登录。
请问,问题出在哪?

CoolSlob 发表于 2005 年 06 月 08 日

这个问题我还没注意,也许是这样的:
授权是从根目录开始的,所以首先要给 [/] 授权,然后再给其下的子目录授权。