基于 svnserve 的服务器

简介

有一些情况下,不能使用Apache作为你的服务器,Subversion包括Svnserve-一个轻型的独立服务器,使用普通TCP/IP连接之上的自定义协议。

大多数情况下svnserve的设置更加简单,也比Apache的服务器更加快。

安装 svnserve

  1. http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91得到最新版本的Subversion。

  2. 如果你已经安装了Subversion,svnserve已经运行,你需要在继续之前把它停下来。

  3. 运行Subversion安装程序,如果你在你的服务器上运行,可以跳过第4步。

  4. 打开资源管理器,进入Subversion的安装目录(通常是C:\Program Files\Subversion)的bin目录,复制svnserve.exelibdb44.dlllibeay32.dllssleay32.dll到你的服务器目录,例如c:\svnserve

运行 svnserve

现在svnserve已经安装了,你需要在你的server运行它,最简单的方法是在DOS窗口或者windows快捷方式输入:

svnserve.exe --daemon

svnserve将会在端口3690等待请求,--daemon选项告诉svnserve以守护进程方式运行,这样在手动终止之前不会退出。

如果你没有创建一个版本库,根据下面的Apache服务器设置指令“配置”一节

为了验证svnserve正常工作,使用TortoiseSVN版本库浏览器来查看版本库。

假定你的版本库位于c:\repos\TestRepo,你的服务器叫做localhost,输入:

svn://localhost/repos/TestRepo

当被版本库浏览器提示输入。

You can also increase security and save time entering Url's with svnserve by using the --root switch to set the root location and restrict access to a specified directory on the server:

svnserve.exe --daemon --root drive:\path\to\repository\root

Using the previous test as a guide, svnserve would now run as:

svnserve.exe --daemon --root c:\repos

And in TortoiseSVN our repo-browser Url is now shortened to:

svn://localhost/TestRepo

Note that the --root switch is also needed if your repository is located on a different partition or drive than the location of svnserve on your server.

Svnserve will service any number of repositories. Just locate them somewhere below the root folder you just defined, and access them using a URL relative to that root.

警告

不要创建和访问网络共享上的 Berkeley DB 版本库,它不能存在于一个远程的文件系统,即使是映射到盘符的共享。如果你希望在网络共享使用 Berkeley DB,结果难以预料-你可能会立刻看到奇怪的错误,也有可能几个月之后才发现数据库已经损坏了。

以服务形式运行 svnserve

如果你关心有必须有用户登录才能运行svnserve,或者担心有人关闭了svnserve而忘了重新启动,可以将svnserve设置为windows服务,从Subversion1.4开始,svnserve可以作为windows服务安装,在以前可以使用包裹器安装。

为了将svnserve安装为windows服务,执行下面的命令,就会创建一个会随windows自动启动的服务。

sc create svnserve binpath= "c:\svnserve\svnserve.exe --service 
	--root c:\repos" displayname= "Subversion" depend= tcpip start= auto

提示

Microsoft现在建议服务运行于本地服务或网络服务帐户,参考The Services and Service Accounts Security Planning Guide。以本地服务帐户创建服务,需要在例子里追加下面几行。

obj= "NT AUTHORITY\LocalService"

请注意需要给本地服务帐户一些目录的适当权限,包括的Subversion和你的版本库,还有所有钩子脚本使用的应用。

为了使用包裹器安装svnserve,一个人为svnserve编写了SvnService。Magnus Norddahl采用了微软的骨架代码,Daniel Thompson做了进一步的改进。Daniel的版本可以从tigris.org下载。

许多更原始的工具像firedaemon也可以工作,请注意你仍然需要使用--daemon选项运行svnserve。

最后,如果你可以访问Windows 2000/XP/2003资源工具箱,你可以使用来自微软的SrvAny,这是微软官方的运行服务的方法,但是有一点混乱(需要编辑注册表),而且如果停止服务,它会直接杀掉svnserve,而不会让svnserve进行清理。如果你不想安装所有的资源工具箱,你可以Daniel Petri下载SrvAny组件。

svnserve 的认证

缺省的svnserve设置提供了匿名的只读访问,这意味着你可以使用svn://的URL进行检出和更新,或者使用TortoiseSVN的版本库浏览器查看版本库,但是不能提交任何修改。

为了打开对版本库的写访问,你可以编辑版本库目录的conf/svnserve.conf文件,这个文件控制了svnserve守护进程的配置,也提供了有用的文档。

为了打开匿名的写访问,只需要简单得设置:

[general]
anon-access = write

然而,你不会知道谁修改了版本库,因为svn:author属性是空的,你也不能控制谁来修改版本库,这是一个很危险的设置。

解决这个问题的一个方法是创建密码数据库:

[general]
anon-access = none
auth-access = write
password-db = userfile

这里userfilesvnserve.conf文件在同一个目录,这个文件也可以存在于文件系统的其他地方(当多个版本库使用相同的访问权限时尤其有用),并使用绝对路径引用,或者是conf的相对目录,使用\或盘符不能工作。userfile的结构如下:

[users]
username = password
...

这个例子拒绝所有的未认证用户(匿名)访问,给userfile中的用户读写权限。

提示

如果维护多个版本库使用相同的密码数据库,使用一个认证域将让用户的工作更加简单,因为TortoiseSVN可以缓存你的凭证,所以你只需要输入一次,更多的信息可以看《使用 Subversion 进行版本管理》,对应的章节为创建用户文件和域客户端凭证缓存

使用 svn+ssh 认证

另一种svnserve认证的方法是使用SSH来建立请求通道。

通过此方法,svnserve不会作为守护进程启动,而是SSH为你启动svnserve,以SSH授权用户运行,为此,你需要在你的服务器上有SSH守护进程。

详细描述安装和设置SSH已经超过了本文的范围,然而你可以在TortoiseSVN FAQ里查找“SSH”。

更多的关于svnserve的信息可以看《使用 Subversion 进行版本管理》

svnserve 以路径为基础的授权

从Subversion1.3开始,svnserve支持与mod_authz_svn相同的路径为基础的授权模式,你需要编辑版本库路径下的conf/svnserve.conf引用的授权文件。

[general]
authz-db = authz

在这里,authz是你创建用来定义访问权限的文件,你可以为每一个版本库使用单独的文件,或者为所有的版本库使用相同的文件,关于此文件的格式可以查看“路径为基础的授权”一节