具有部分读取权限的分支目录

Branching directory with partial read access

我有一个使用 authz 来控制访问的 svn 存储库。结构如下所示:

├── branches
│   └── bob
├── tags
└── trunk
    └── A
        ├── B
        │   └── README.txt
        └── README.txt

假设 authz 授予用户对目录 A 但不是 B 的读取权限,并且当我尝试分支 A:

时它失败了
[hidden]$ svn copy A ^/branches/bob/A1 -m 'Branching A to branches/bob/A1'
Adding copy of        A
svn: E220001: Commit failed (details follow):
svn: E220001: Access denied

svnserve 的日志说

Authorization Failed recursive read /trunk/A

为什么 svn 有这个限制,有没有办法解决?为什么它不在分支时忽略B,就像结帐一样?

如果事实证明这是不可能的,那么 svn 和 authz 的最佳工作流程是什么?貌似不可以分支,只能是大家都在trunk上干活,不过这也太傻了。

您对该用户具有子节点 B 的拒绝权限,并且拒绝权限覆盖读取权限。

当分支 A 时,B 不能被跳过(它在 A 内部,并且据 SVN 所知或关心,它是 A 的一部分)。这就是为什么你不能这样做。这实际上是一件好事,因为它会阻止您,因为您通常不希望分支错过源文件夹。

对此应该没有解决方法,这种行为实际上是有道理的。要使分支操作成功,您需要:

  • 将 B 移到 A 之外
  • 授予用户访问 A 及其下的所有内容

我知道在某些情况下这可能令人沮丧,但如果 B 不依赖于 A,或者如果从事 A 工作的人不关心 B 或需要访问 B - 在这种情况下案例 B 不应该真的在 A 里面。

SVN 的初始 authz 实现没有检查复制时的整个子树,但后来添加到地址 this security hole

所以结论是,SVN 的 authz 从一开始就没有设计好,迟早会有很多 hacky 和肮脏的修复程序,最终导致您的用例不受支持。恕我直言,一个好的实现应该只跟踪从哪里复制分支并检查源的 authz。

我同意您的用例完全有效并且 Perforce 很好地支持基于路径的授权。不幸的是你不能在 svn 中做到这一点。您可以切换到 Perforce,或者等待他们 improve authz.