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