本文档旨在描述 Subversion 1.1。如果您正在运行较新版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的书籍。

支持多种仓库访问方式

您已经了解了仓库可以通过多种方式访问。但是,您的仓库是否可以安全地同时被多种方式访问呢?答案是肯定的,只要您事先做好规划。

在任何给定时间,这些进程可能需要对您的仓库进行读写访问

管理员遇到的最常见问题是仓库所有权和权限。上述列表中的每个进程(或用户)是否都有权读取和写入 Berkeley DB 文件?假设您使用的是类 Unix 操作系统,一个简单的办法可能是将所有潜在的仓库用户放到一个新的svn组中,并将仓库完全归该组所有。但即使这样也不够,因为进程可能会使用不友好的 umask 写入数据库文件,这会导致其他用户无法访问。

因此,除了为仓库用户设置一个公共组之外,下一步是强制所有访问仓库的进程使用合理的 umask。对于直接访问仓库的用户,您可以将 svn 程序变成一个包装脚本,该脚本首先设置 umask 002,然后运行真实的 svn 客户端程序。您可以为 svnserve 程序编写类似的包装脚本,并在 Apache 自己的启动脚本中添加 umask 002 命令,apachectl。例如

$ cat /usr/bin/svn

#!/bin/sh

umask 002
/usr/bin/svn-real "$@"

另一个常见问题通常在类 Unix 系统上遇到。随着仓库的使用,BerkeleyDB 偶尔会创建新的日志文件以记录其操作。即使仓库完全由 svn 组拥有,这些新创建的文件也不一定会由同一个组拥有,这会为您的用户带来更多权限问题。一个好的解决方法是在仓库的db目录上设置组 SUID 位。这会导致所有新创建的日志文件具有与父目录相同的组所有者。

完成这些步骤后,您的仓库应该可以被所有必要的进程访问。这可能看起来有点混乱和复杂,但让多个用户共享对公共文件的写访问权的问题是经典的问题,通常没有优雅的解决方案。

幸运的是,大多数仓库管理员永远不需要进行如此复杂的配置。希望访问位于同一台机器上的仓库的用户不仅限于使用file://访问 URLs——他们通常可以使用 Apache HTTP 服务器或 svnserve 使用localhost作为服务器名称,在他们的http://svn://URLs 中。为您的 Subversion 仓库维护多个服务器进程可能会比必要更麻烦。我们建议您选择最符合您需求的服务器,并坚持使用它!