本篇文档是描述 Subversion 1.4 的。如果您正在使用更新版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的文档。
您已经了解了仓库可以通过多种不同的方式访问。但是,您的仓库是否可以同时通过多种方法安全访问?答案是可以的,只要您稍微考虑一下。
在任何给定时间,这些进程可能都需要对您的仓库进行读写访问
使用 Subversion 客户端(作为自身)通过 file:// URL 直接访问仓库的常规系统用户;
连接到 SSH 启动的私有 svnserve 进程(以自身身份运行)并访问仓库的常规系统用户;
以特定固定用户身份运行的 svnserve 进程(守护进程或由 inetd 启动的进程);
以特定固定用户身份运行的 Apache httpd 进程。
管理员遇到的最常见问题是仓库所有权和权限。上述列表中的每个进程(或用户)是否都具有读写 Berkeley DB 文件的权限?假设您使用的是类 Unix 操作系统,一种直接的方法可能是将所有潜在的仓库用户放入一个新的 svn 组中,并将仓库完全归该组所有。但即使这样也不够,因为一个进程可能会使用不友好的 umask 写入数据库文件,从而阻止其他用户访问。
因此,除了为仓库用户设置一个公共组之外,下一步是强制所有访问仓库的进程使用合理的 umask。对于直接访问仓库的用户,您可以将 svn 程序变成一个包装脚本,该脚本首先设置 umask 002,然后运行真正的 svn 客户端程序。您可以为 svnserve 程序编写类似的包装脚本,并将 umask 002 命令添加到 Apache 的自身启动脚本 apachectl 中。例如
$ cat /usr/bin/svn #!/bin/sh umask 002 /usr/bin/svn-real "$@"
另一个常见问题经常出现在类 Unix 系统上。随着仓库的使用,Berkeley DB 偶尔会创建新的日志文件来记录其操作。即使仓库完全归 svn 组所有,这些新创建的文件也不一定会归该组所有,这会为您的用户带来更多权限问题。一个好的解决方法是在仓库的 db 目录上设置组 SUID 位。这会导致所有新创建的日志文件与父目录具有相同的组所有者。
完成这些步骤后,您的仓库应该可以被所有必要的进程访问。这可能看起来有点乱且复杂,但多个用户共享对公共文件的写访问权限的问题是经典问题,通常没有优雅的解决方法。
幸运的是,大多数仓库管理员永远 不需要 如此复杂的配置。希望访问位于同一台机器上的仓库的用户不仅限于使用 file:// 访问 URL,他们通常可以使用 Apache HTTP 服务器或 svnserve,在他们的 http:// 或 svn:// URL 中使用 localhost 作为服务器名称。而且,为您的 Subversion 仓库维护多个服务器进程可能比必要更麻烦。我们建议您选择最符合您需求的服务器,并坚持使用它!