SVN可以配置多种方式进行访问,但在公司内部搭建的svn服务器,如果仅仅在局域网里访问的话,总感觉用svn协议要比http协议来得效率高些,所以,一般总是用svnserve来启动svn的服务。一般而言,如果是从svn 1.2或1.3的版本开始使用的人,总以为svn协议只能配置到仓库的权限控制,而不能针对目录进行权限控制,即使看到其authz示例文件中有如下的内容:
#
[
repository:/baz/fuz
]
# @harry_and_sally
=
rw
# *
=
r
但谨守其自带文档Chapter 6中关于svnserve一节的教导:
Notice that svnserve only understands “blanket” access control. A user either has universal read/write access , universal read access, or no access. There is no detailed control over access to specific paths within the repository. For many projects and sites , this level of access control is more than adequate. However , if you need per-directory access control , you'll need to use either use Apache with mod_authz_svn (see the section called “Per-Directory Access Control”) or use a pre-commit hook script to control write access (see the section called “Hook Scripts”).
一般还是不会多去研究,只当作是结合Apache来进行面向目录的权限控制文件示例。
其实,心里一直对这种方式有个小疙瘩,最近又要开一个新项目的代码库,虽然实际上对代码的访问控制也没有特别的要求,但心想既然authz文件里有关于目录的设置,是不是能尝试一下,用svnserve也能进行目录权限的控制呢。于是到网上搜了一下,omg,这个功能竟然早在1.3的时候就已经实现了,对其详尽而完整的描述来自Michael的这篇Subversion之路--实现精细的目录访问权限控制 ,其中的几个要点包括:
1. svnserve支持面向目录的访问控制了;
2. 权限具备继承性,所以需要用"* = "的形式来禁止未授权的用户访问特定子目录;
3. svn 1.3.2及以后的版本允许对子目录进行操作而无需父目录的读权限;
4. 如果是中文目录的话,authz必须以utf-8的格式保存,且不能带BOM,而windows自带的记事本按utf-8保存的文件则会加上BOM,所以,如果你以utf-8格式保存好后,提交代码时,svn报"section header expected"的错时,则多半是带BOM的。当然现在很多编辑器都能很方便的转换了,如ultraedit的保存为U8-DOS,editplus保存为utf-8,以及开源的Notepad++的格式转换中的“转换为utf-8码(无BOM)”等都可以完成这个工作。
无论如何,这总算解开了我心中的一个小疑团,所以,即使软件自带的文档,往往也不是绝对的权威(叫我还能相信谁:-( ,在svn 1.4.2版本中带的文档,还是针对1.3的)。不过Subversion Book网站上提供的针对svn 1.4的nightly版本已经很明确的讲解了这一部分的内容了。