每个存储库 AuthzSVNAccessFile apache 规则与单个 apache 配置文件或其他 shell 脚本解决方案

Jon*_*bel 0 svn apache shell mod-rewrite apache2

我正在编写一组 svn 钩子来允许远程管理 SVN 存储库,就像 gitolite 对 GIT 所做的那样。

我创建了为我拥有的每个存储库生成 AuthzSVNAccessFile 的脚本,现在我需要告诉 Apache 根据存储库查找它们中的每一个。

我不能为每个存储库都有一个 apache 配置文件,因为它需要重新启动 apache 服务器。

我知道我可以使用单个 AuthzSVNAccessFile 来管理多个存储库,但是构建文件的脚本需要时间(需要发现存储库中每个目录的完整路径),并且会使提交花费太长时间。

我尝试使用mod_rewrite,但没有用,可能是我用错了。

基本上我需要在我的 apache 配置文件中有一个规则,根据请求的 URL 读取不同的文件,这可能吗?如何?

或者我需要一个能够重写文件块的脚本。我sed用来替换模板中的字符串,但不知道如何使用它来替换多行。

谢谢你的时间

Ben*_*ser 5

除非我完全误解了您的问题,否则不知道您为什么要尝试使用 mod_rewrite。但听起来您正在使用 SVNParentPath 并且无法弄清楚如何为所有存储库配置 authz 设置。

你有几个选择。

使用一个 authz 文件

您实际上可以生成单个 authz 文件并指定规则适用于哪些存储库。语法采用以下形式[repos-name:path](您可以在Subversion Book 的基于路径的授权部分找到)。这样做的一个缺点是,如果您有很多存储库和很多带有规则的路径,它会减慢速度。听起来你已经遇到了。可以帮助缓解这种情况的一件事是使用以下配置

SVNPathAuthz short_circuit
Run Code Online (Sandbox Code Playgroud)

当需要访问请求的 URI 之外的其他路径(例如日志、提交等)时,SVNPathAuthz控制如何授权对 URI 之外的路径的请求。默认行为是发出子请求。这会在 httpd 中生成一个新的 GET 请求,并通过 httpd 的所有授权基础结构发送它。但是,在几乎所有情况下,这都不是必需的,因为唯一可以随用于服务 SVN 的位置下的路径而变化的授权配置是 mod_authz_svn 配置。short_circuit,告诉 Subversion 避免所有这些,只需将授权信息直接发送给 mod_authz_svn,后者提供直接限制延迟的答案。

这可能还不够,所以有几个替代方案,但您至少需要 1.7 才能使用它们。

AuthzSVNReposRelativeAccessFile

Subversion 1.7 添加了一个新的配置指令,允许您指定相对于存储库的 conf 子目录的路径。例如,如果您有一个名为 foo 的存储库,您可以将 authz 文件放在 /path/to/foo/conf/authz 中,然后设置以下配置值:

AuthzSVNReposRelativeAccessFile authz
Run Code Online (Sandbox Code Playgroud)

使用 AuthzSVNAccessFile 的 1.7 之前的指令是相对于服务器根路径的。

在存储库中 Authz*

Subversion 1.8 允许您将 authz 文件存储在存储库本身中。因此,例如,如果您将 repo 中名为 conf 的目录中的文件作为文件 authz 提交,那么您将执行以下操作:

AuthzSVNAccessFile ^/authz
Run Code Online (Sandbox Code Playgroud)

^/ 语法被替换为存储库的完整路径。

如果您决定使用它,您可能希望阅读 1.8 的链接发行说明中的​​详细信息。