背景简介。我们在没有网络访问权限的 Windows 机器上运行 Subversion Server 1.6.5(没有 Apache,只有 SVN 服务器)。我们只使用 TortoiseSVN 和 AnkhSVN,对于持续集成,我们使用 svn 客户端命令行。
好的,我在网上查了一下,也读了一些 SVN 书,但我不明白为什么这个用户设置不起作用。
authz(SVN授权文件)内容:
### Sanitized version
[groups]
devUsers = user1
qaUsers = user2
[/]
@devUsers = r
@qaUsers = r
[/Dev/SourceCode]
@devUsers = rw
~devUsers =
### QA Projects
[/Dev/testCases]
@qaUsers = rw
~qaUsers =
据我所知,您必须授予所有用户至少对存储库根目录的读取权限。好的,很好。这可行。接下来,我的 /Dev/SourceCode 目录应该只能由 @devUsers 访问,但由于某种原因,在 TortoiseSVN 的存储库浏览器中@qaUsers
可以看到此文件夹。我猜全局读取访问权限/
会覆盖~devUsers =
authz 文件中的行?对于 /Dev/TestCases 文件夹也是如此,它应该只能由访问@qaUsers
,但@devUsers
也可以查看此文件夹。这是我的问题之一。
但主要问题是 /Dev/SourceCode 的子文件夹是只读的。我知道这一点,因为当我尝试将某些内容签入子文件夹时,它显示授权失败。但是,在根文件夹中,如果您签入文件,它就可以正常工作。
我猜这是/
只读访问再次覆盖了一切。这是否意味着必须为每个子文件夹赋予明确的 rw 权限?有没有办法从现在开始使用当前父文件夹的权限?即 /Dev/SourceCode 的权限。如果您想在有许多子文件夹的情况下授予所有子文件夹 rw 权限,这似乎真的很不方便。
答案1
当我看到您的授权文件时,我的第一个想法是,“路径声明中是否缺少存储库名称?”
我的意思是,
[/Dev/SourceCode]
@devUsers = rw
@qaUsers =
看起来应该是
[<repo-name>:/Dev/SourceCode]
@devUsers = rw
@qaUsers =
或者,如果“Dev”是存储库的名称,
[Dev:/SourceCode]
@devUsers = rw
@qaUsers =
我使用 apache 作为我们的存储库,但无论是 httpd 还是 svnserve,语法看起来都相同:基于路径的授权
我希望这有帮助。
谢谢你,
扎卡里
答案2
权限的级联应该可以按预期工作;不需要每个目录都具有权限。您只需指定更具体的路径来覆盖父级的权限,就像您正在做的那样。
我不熟悉~groupname
语法。您显然想让它表示否定(不在组中的用户),但我不确定它是否受支持。尝试类似这样的操作(您的前两个部分用于组定义和 root 访问权限相同):
[/Dev/SourceCode]
@devUsers = rw
@qaUsers =
[/Dev/testCases]
@qaUsers = rw
@devUsers =
这应该可行,尽管拒绝开发人员访问测试用例让我很难过。
编辑:既然您已经尝试过,但不起作用...也许可以尝试反转顺序?匹配应该从最具体到最不具体进行,因此顺序无关紧要,但我至少会尝试将它们放在文件中比 [/] 权限更早的位置。如果这有区别,那么我怀疑您的服务器版本中存在错误。
答案3
与我的其他答案完全不同的想法:
...你确定你的[/Dev/testCases]定义中没有拼写错误(例如大小写)?(你使用的是Windows:我知道如果某些内容实际上被命名为“DEV”,Windows会将其显示为“Dev”,例如...但SVN可能会在意)
...另外,你确定它不应该是[/trunk/Dev/testCases]或者别的什么吗?