Windows下Subversion管理配置详细说明(1)

从Subversion1.4开始,Subversion本身就集成Windows服务的工具。我们不必像以前一样,必须依赖于svnservice或其他工具。

 

准备工作:

下载vs的插件Ankhsvn:  http://ankhsvn.open.collab.net/daily

 

1,安装svnservice

在Windows NT中(包括Windows XP, Windows 2000, Windows 2003 Server)本身包含了一个安装服务的工具,叫做"Service Control",也就是sc.exe。例如我的Subversion安装在"D:\Subversion",版本库在"D:\svnroot",而我希望对应的Subversion服务名为svnservice,安装这个svn服务的命令就可以这样写:

sc create svnservice  

binpath"D:\Subversion\bin\svnserve.exe --service -r D:\svnroot" 

displayname"SVNService" 

dependTcpip  

请注意,因为便于察看,上面的命令分为多行,但在实际执行时应该在一行里。另外,在以前启动svnserve时会使用"-d"选项,也就是守护进程模式,在这里不能使用,会导致服务无法启动。同样,"-i"和"-t"选项也不能使用。在命令行窗口执行完这个命令之后,服务还没有启动,你可以继续运行"net start svnservice"启动这个服务,然后使用"net stop svnservice"停止服务。

另外还有两点需要小心处理。首先,如果路径中包括空格,一定要用“\”处理“"”号,例如上面的例子中如果svnserve.exe在“c:\program files\subversion\”中,则命令应该写为“binpath= "\"c:\program files\subversion\bin\svnserve.exe\"”(“”中的内容),整个命令如下,红色部分是改变部分。

sc create svnservice  

binpath= "\"D:\program files\Subversion\bin\svnserve.exe\" --service -r D:\svnroot"  

displayname"SVNService" 

dependTcpip  

其次,sc对选项的格式还有要求,例如“depend= Tcpip”不能写为“depend = Tcpip”或“depend=Tcpip”,也就是“=”前不能有空各,而后面必须有空格。

2,删除服务

如果服务安装的有问题,你可能需要删除服务。要删除前面添加的服务,只需要运行"net start svnservice","svnservice"就是我们创建服务时使用的名字。

3,配置服务是自动启动

默认情况下安装的服务不会随Windows的启动而启动,为了使svn服务能够随Windows启动而启动,需要修改一下"sc create"命令(首先要删除),增加"start= auto"选项:

sc create svnservice  

binpath"D:\Subversion\bin\svnserve.exe --service -r D:\svnroot" 

displayname"SVNService" 

dependTcpip 

startauto  

当然你也可以使用图形化的工具修改服务的属性,你可以在“开始->运行...”中执行"services.msc",然后在界面中修改。

详细配置可以查看 http://svnbook.red-bean.com/nightly/en/svn.serverconfig.html

Subversion的权限控制

1,认证(Authentication)和授权(Authorization)

这两个术语经常一起出现。其中认证的意思就是鉴别用户的身份,最常见的方式就是使用用户名和密码,授权就是判断用户是否具备某种操作的权限,在Subversion里提供了“authz-db”文件,实现了以路径为基础的授权,也就是判断用户是否有操作对应路径的权限,在Subversion 1.3之后,svnserve和Apache一样都可以使用“authz-db”文件。

2. svnserve下的配置文件

因为本文是以svnserve为例的,所以先介绍一下版本库目录的结构:

D:\SVNROOT\PROJECT1  

├─conf  

├─dav  

├─db  

│ ├─revprops  

│ ├─revs  

│ └─transactions  

├─hooks  

└─locks  

其中conf下面有三个文件:

authz  

passwd  

svnserve.conf  

其中的“svnserve.conf”是这个版本库的配置文件,当使用svnserve时,这个配置文件决定了使用什么认证和授权文件:

password-db = passwd 

authzauthz-db = authz  

上面的配置说明使用“svnserve.conf”同目录的passwd和authz,其中的password-db指定了用户密码文件,authz-db是我们的授权文件,也就是我们本文主要介绍的文件。注意:使用Apache作为服务器时,根本就不会参考“svnserve.conf”文件的内容,而是会参考Apache的配置。

3,基于svnserve的版本库文件布局

使用svnserve时,为了管理的方便,应该使用相同的认证和授权文件,所以应该让所有版本库的配置文件svnserve.conf指向同一个password-db和authz-db文件。下面是一个多版本库的目录:

D:\SVNROOT  

├─project1  

│ ├─conf  

│ ├─dav  

│ ├─db  

│ │ ├─revprops  

│ │ ├─revs  

│ │ └─transactions  

│ ├─hooks  

│ └─locks  

└─project2  

├─conf  

├─dav  

├─db  

│ ├─revprops  

│ ├─revs  

│ └─transactions  

├─hooks  

└─locks  

D:\SVNROOT下有两个目录project1和project2,都已经创建了版本库,所以我们修改每个conf目录下的svnserve.conf,使之指向同一个password-db和authz-db文件。

password-db = ..\..\passwd 

 

authz-db = ..\..\authz这样,D:\SVNROOT\passwd和D:\SVNROOT\authz就控制了所有版本库的svnserve访问。另外在后面的操作中要关闭匿名访问,应该去掉“anon-access = none”前的“#”号,保证只有认证用户可以访问。

注意:还有一点需要注意,那就是svnserve的“realm”的值,在上面的设置下,应该保证所有的版本库使用相同的realm值,这样,对版本库的密码缓存可以在多个版本库之间共享,更多细节见客户端凭证缓存。

4,测试用户和组说明

版本库禁止任何匿名用户的访问,只对认证用户有效。root:配置管理管理员,对版本库有完全的管理权限。

p1_admin1:project1的管理员,对project1有完全权限。  

p1_d1:project1的开发者,对project1的trunk有完全的权限,但是对其中的/trunk/admin目录没有任何权限。  

p1_t1:project1的测试者,对project1的trunk有完全的读权限,但是对其中的/trunk/admin目录没有任何权限。  

 

p2_admin1:project2的管理员,对project2有完全权限。  

p2_d1:project2的开发者,对project2的trunk有完全的权限,但是对其中的/trunk/admin目录没有任何权限。  

p2_t1:project2的测试者,对project2的trunk有完全的读权限,但是对其中的/trunk/admin目录没有任何权限。 

对应的组及组的用户:

p1_group_a:p1_admin1  

p1_group_d:p1_d1  

p1_group_t:p1_t1  

p2_group_a:p2_admin1  

p2_group_d:p2_d1  

p2_group_t:p2_t1  

5,修改D:\SVNROOT\passwd文件

前面已经说过了,用户和密码文件应该是在D:\SVNROOT\passwd,所以我们为每一位用户设置权限,文件内容如下:

[users]  

p1_admin1p1_admin1 = p1_admin1  

p1_d1p1_d1 = p1_d1  

p1_t1p1_t1 = p1_t1  

 

p2_admin1p2_admin1 = p2_admin1  

p2_d1p2_d1 = p2_d1   

p2_t1 = p2_t1为了便于验证,所有密码和用户名一致,如果你使用的是其他认证方式,这一步可能不同,但是用户名应该都是一样的。

6,配置授权,修改D:\SVNROOT\authz

[groups]  

# 定义组信息  

 

p1_group_a = p1_admin1 

p1_group_d = p1_d1 

p1_group_t = p1_t1 

 

p2_group_a = p2_admin1 

p2_group_d = p2_d1 

p2_group_t = p2_t1 

 

[/]  

# 指定所有的版本库默认只读,root可读写  

* = r  

root = rw 

 

[project1:/]  

# 指定对版本库project1根目录的权限  

@p1_group_a = rw 

@p1_group_d = rw 

@p1_group_t = r  

 

[project1:/trunk/admin]  

# 指定对版本库project1的/trunk/admin根目录的权限,  

# p1_group_a读写,p1_group_d和p1_group_t没有任何权限。  

@p1_group_a = rw 

@p1_group_d =   

@p1_group_t =   

 

[project2:/]  

# 指定对版本库project2根目录的权限  

@p2_group_a = rw 

@p2_group_d = rw 

@p2_group_t = r  

 

[project2:/trunk/admin]  

# 指定对版本库project1的/trunk/admin根目录的权限  

@p2_group_a = rw 

@p2_group_d =   

@p2_group_t =   

经过以上设置以后,你会发现一些有趣的事情。当使用用户“p1_d1”,检出project1的trunk时,目录是空的,好像admin目录根本不存在一样,当使用p1_d1用户浏览版本库时,能够看到admin目录,但是其中的内容却无法看到。

关于中文目录,也是没有问题的,只是注意要把authz文件转化为UTF-8格式,在我的WINXP的UltraEdit里显示的文件格式为U8-DOS,具体的做法是用UltraEdit打开authz文件,然后选择“文件->转换->ASCII转UTF-8”,然后保存。再复杂的情况也不过如此,在实际的工作中要首先规划好权限,只赋给用户最小的权限,保证以最小的配置实现最复杂的权限控制。

posted @ 2012-02-09 13:26  龙行星宇  阅读(275)  评论(0编辑  收藏  举报