See MJ !

程序媛早起为码字

SVN配置文件解析

搭建一个SVN服务器,主要用于代码、文件等的版本控制。

通常有两种配置方式,一种是结合apache服务器,给apache添加SVN模块,修改配置,重启服务,这种方式相对复杂,但能提供多种认证,能建立一套安全的版本控制环境;另外一种是使用独立服务器,svnserve,这种方式简单暴力。除了环境本身的配置文件,apache的诸如httpd.conf, apache.conf,svnserve本身的svnserve.conf之外,SVN的权限管理文件的配置形式大体上一致。

以svnserve为例,配置文件可启用一个配置文件authz管理所有仓库的配置,也可以配置成一个配置文件管理一个仓库的模式。这里简化,只介绍一个文件配置一个仓库的情况。

authz的常见格式有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#每一部分通常为组定义,可以有多个组,每个账号可以属于多个组
#通常一组为一行,后面的定义会覆盖前面组的定义
[groups]
group = user1, user2
group2 = user3, user4, user5
group3 = @group, user6

#以下是目录权限定义
#权限的表达方式只分为:只读r, 读写rw, 无权限
#等号左边的\*号表示对所有
[/]
* = r
@group = rw
user4 = rw

[/]
@group2 = rw
user6 = rw

[/trunk]
@group3 = rw
user5 = rw

[/tags]
@group3 = r
user5 = rw

对于组的定义[groups]有几点说明:

    • 组的等价定义是一种包含关系,如上文,组group3包含了用户user1, user2, user6,在目录权限[/trunk]中,组拥有读写权限,表示此目录对用户user1, user2, user6开放;
    • 组包含了另外一个等价组,当另外一个组没有定义时,配置文件不合法
    • 组之间若有相互引用,换言之,组不能被解析尽,则配置文件不合法, 如下所示
1
2
3
4
[groups]
group=@group1
group1=@group2, user6
group2=@group, user5

同理,当权限定义中, 某个路径指定了某个组没有定义,配置文件也不合法?

关于大小写,尝试了某个版本,发现:

    • 路径是大小写区分的
    • 用户是大小写区分的
    • 组是大小写不区分的

此外,路径必须要是绝对路径,以’/‘开头,否则,配置文件失效。 配置文件失效的时候,在客户端连接SVN服务器的时候能够得到’invalid authz’的提示。

测试过程

1
2
3
4
5
6
7
#配置文件
authz
passwd
#启动服务:
svnserve -d -r /home/cmj/svn-project/
#使用客户端连接:
svn checkout svn://[server_ip]/repos/doc --username bob

如上文,出现了两次关于SVN的路径定义会覆盖?

大多数的SVN服务器版本来说,配置文件中路径的定义并没有先后之分,被引用组的定义甚至可以出现在被引用之后,而与在之前定义并无二义。但是对于某些较早时代的版本与现代的版本有较大差异,部分SVN配置文件对于父子目录的权限控制有相关关系。此是后话。