三、配置SVN服务器如果你对我们如何配置SVN的服务器,以及它的权限管理如何设置感兴趣,欢迎你阅读下面的部分,这里仅仅对第一节当中阐述的svn+ssh,且使用密钥对认证的方式进行说明。希望我们以后有更多的同学可以承担服务器的维护工作。这里我们假设你已经比较熟悉Linux上的一些基本操作,否则的话请去补习一下^_^1、创建独立的svn版本库属主,也就是前面提到过的svnowner。我们希望svnowner自己是一个独立的用户,同时也独立成组,这样可以避免不必要的外人干扰。以下的操作除非特别说明,均使用svnowner用户进行操作。2、以svnowner用户的身份创建版本库。首先使用umask027的方式设置掩码值,使得之后创建的文件和目录对本组用户只有读权限,组外用户无权限。如果考虑更严格的权限控制,可以使用umask077方式,仅允许svnowner用户自己访问,拒绝本组、组外用户的任何访问。接着用svnadmincreatepath_for_repository在path_for_repository路径上创建版本库。从便利和权限一致性的角度,建议把svn、svnserve、svnadmin、svnlook等svn工具改名为real_svnxxx,再创建svn等脚本程序,例如svn脚本可以这样编写:#!/bin/bashumask027/usr/bin/real_svn“$@”3、创建SSH公钥存放文件。在svnowner用户目录下创建.ssh目录,并在其下创建authorized_keys文件,目录和文件的都应当仅仅是本用户可读写的。将各用户发送给你的公钥添加到authorized_keys文件当中,注意:一行一个公钥,并在公钥前增加option字段,例如:command=/home/svnowner/svnserve-t-rpath_for_repository–tunnel-user=svnuser1,no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-ptyssh-rsa.......(RSAKeyhere)....user1上例当中,用户user1使用该密钥对认证之后将会执行/home/svnowner下的svnserve,显然这应当是一个包含设置umask的脚本,并且以path_for_repository作为版本库的根,svnserve运行于tunnel模式下,使用的svn用户名是svnuser1。再次提醒大家的是以上内容需要在authorized_keys里面一行内写完。4、现在可以在版本库里面设置具体的svnuser的权限了。进入之前所创建的path_for_repository目录,在其中有conf目录,是负责配置版本库的设置的。找到svnserve.conf文件,在其中去掉注释并修改的行有:anon-access=noneauth-access=writeauthz-db=authzrealm=XXXGroupRepository表明匿名用户无访问权限,认证用户可以具备写权限,版本库标识为“XXXGroupRepository”(此项可选),权限认证数据库是authz文件。于是再修改authz文件,示例:[groups]manager=svnuser1members=svnuser2,svnuser3[/]@manager=rw*=r[/src]@members=r@manager=rw*=[/src/arm7]svnuser2=rw@manager=rwsvnuser3=r*=[/src/arm9]svnuser3=rw@manager=rwsvnuser2=r*=[/shared]@members=rw以上示例的目的是将所有的目录置于manager可读写的方式,members用户可以对src目录具有可读权限,svnuser2和svnuser3分别对src/下的ARM7、ARM9目录具有读写权限,三个用户均可以对/shared目录进行读写。匿名用户(其他用户)只能对/shared目录进行读操作。注意:目录路径均以path_for_repository作为根目录,这一点需要牢记。SVN的一个明显的优点是可以针对单个目录具备独立的控制权限,这是比cvs更灵活的方面。并且,这也很适宜在团队这样的大范围内推广、且具有可控保密措施的实施方案。更详细的一个权限示例建议大家参考由“郑新星zhengxinxing@gmail.com”所写的《Subversion之路——实现精细的目录访问权限控制》。至此,Subversion服务器的搭建工作完毕,管理员的后续维护工作包括接受组内用户密钥对的更改、删除,为Subversion作定期备份等等。本文也暂告一段落独立运行的Subversion权限设置很简单,首先打开snvserve.conf,去掉下面一行的注释authz-db=authz然后打开同一目录下的authz这个文件,这个文件便是整个权限控制的核心,先来看一个例子:[groups]dev-group=liudong,xfliangdesign-group=newidea[/]@dev-group=rw@design-group=r*=[/doc]@design-group=rw[/webapp]@design-group=rw接下来我给大家解释一下这个文件,相信就可以明白Subversion如何来做权限控制的了。首先我定义了两个组,一个开发组(dev-group),一个设计组(design-group),接下来我让dev-group对整个目录有读写的权限,而design-group只有读权限。但是接下来的两个子目录design-group就有读写权限,也就是说设计组可以读取整个项目,但只能修改doc以及webapp这两个子目录。*=这行表示其他人不能读写。当然也可以直接指定某个用户,例如我想让liudong这个用户可以读写webapp目录,那设置如下:[/webapp]@design-group=rwliudong=rw另外有一点注意的是,修改这个文件不需要重新启动svn服务,这点太棒了。下面是详细的说明Subversion自带的authz样例中的注释###Thisfileisanexampleauthorizationfileforsvnserve.###Itsformatisidenticaltothatofmod_authz_svnauthorization###files.###Asshownbeloweachsectiondefinesauthorizationsforthepathand###(optional)repositoryspecifiedbythesectionname.###Theauthorizationsfollow.Anauthorizationlinecanrefertoa###singleuser,toagroupofusersdefinedinaspecial[groups]###section,ortoanyoneusingthe'*'wildcard.Eachdefinitioncan###grantread('r')access,read-write('rw')access,ornoaccess###('').svn权限设置小结及“无权打开根进行编辑操作”的解决如果不允许匿名用户访问,设置在svnserve.conf中进行了这样的设置:anon-access=noneauth-access=write如果,anon-access=read,需要在在authz文件中加上:[/]*=r否则在使用SVN进行Checkout时出现错误提示:无权打开根进行编辑操作。。1.svnserve支持面向目录的访问控制了;2.权限具备继承性,所以需要用*=的形式来禁止未授权的用户访问特定子目录;3.svn1.3.2及以后的版本允许对子目录进行操作而无需父目录的读权限;4.如果是中文目录的话,authz必须以utf-8的格式保存,且不能带BOM,而windows自带的记事本按utf-8保存的文件则会加上BOM,所以,如果你以utf-8格式保存好后,提交代码时,svn报sectionheaderexpected的错时,则多半是带BOM的。当然现在很多编辑器都能很方便的转换了,如ultraedit的保存为U8-DOS,editplus保存为utf-8,以及开源的Notepad++的格式转换中的“转换为utf-8码(无BOM)”等都可以完成这个工作