第 3 章 版本库

目录

创建版本库
使用命令行工具创建版本库
使用 TortoiseSVN 创建版本库
本地访问版本库
访问网络共享磁盘上的版本库
版本库布局
版本库备份
服务器端钩子脚本
检出链接
Accessing the Repository
基于 svnserve 的服务器
简介
安装 svnserve
运行 svnserve
svnserve 与基本认证
使用 SASL 以便更安全
使用 svn+ssh 认证
svnserve 基于路径的授权
基于 Apache 的服务器
简介
安装 Apache
安装 Subversion
配置
多版本库
路径为基础的授权
使用 Windows 域认证
多重认证源
用 SSL 使服务器更安全
在虚拟 SSL 主机中使用客户端证书

无论你用什么协议访问你的版本库,都至少需要创建一个版本库,这可以使用Subversion命令行客户端或TortoiseSVN完成。

如果你还没有创建Subversion版本库,是时间开始了。

创建版本库

You can create a repository with the FSFS backend or with the older Berkeley Database (BDB) format. The FSFS format is generally faster and easier to administer, and it works on network shares and Windows 98 without problems. The BDB format was once considered more stable simply because it has been in use for longer, but since FSFS has now been in use in the field for several years, that argument is now rather weak. Read Choosing a Data Store in the Subversion book for more information.

使用命令行工具创建版本库

  1. 创建一个名为SVN(例如D:\SVN\)的空文件夹,作为你的所有版本库的根。

  2. D:\SVN\里创建另一个目录MyNewRepository

  3. 打开命令行窗口(或DOS窗口),进入D:\SVN\目录,输入

    svnadmin create --fs-type bdb MyNewRepository
    

    svnadmin create --fs-type fsfs MyNewRepository
    

现在你在D:\SVN\MyNewRepository创建了一个新的版本库。

使用 TortoiseSVN 创建版本库

图 3.1. 未版本控制文件夹的 TortoiseSVN 菜单

未版本控制文件夹的 TortoiseSVN 菜单

  1. 打开资源管理器

  2. 创建一个新的文件夹,命名为SVNRepository

  3. 右键点击新创建的目录,选择TortoiseSVN在此创建版本库...

    然后就会在新文件夹创建一个版本库,不要手工编辑这些文件!!!如果你得到什么警告,一定要先确定目录非空并且没有写保护。

    You will also be asked whether you want to create a directory structure within the repository. Find out about layout options in “版本库布局”一节.

    TortoiseSVN will set a custom folder icon when it creates a repository so you can identify local repositories more easily. If you create a repository using the official command line client this folder icon is not assigned.

提示

TortoiseSVN 不再给你创建 BDB 版本库的选择,尽管你仍旧可以使用命令行工具创建。FSFS 版本库通常很容易维护,也让我们维护 TortoiseSVN 变得更容易,因为我们不再需要处理不同 BDB 版本之间的兼容性问题。

TortoiseSVN does not support file:// access to BDB repositories due to these compatibility issues, although it will of course always support this repository format when accessed via a server through the svn://, http:// or https:// protocols.

Of course we also recommend that you don't use file:// access at all, apart from local testing purposes. Using a server is more secure and more reliable for all but single-developer use.

本地访问版本库

为了访问本地版本库,你需要这个文件夹的路径,只要记住Subversion期望所有的版本库路径使用的形式为file:///C:/SVNRepository/,请注意全部使用的是斜杠。

为了访问网络共享中的版本库,你可以使用驱动器影射或使用UNC路径,对于UNC路径,形式为file://ServerName/path/to/repos/,请注意这里前面只有两个斜杠。

在SVN 1.2之前,UNC路径曾经是一种非常晦涩的格式file:///\ServerName/path/to/repos,这种格式依然支持,但不推荐。

警告

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

访问网络共享磁盘上的版本库

尽管从理论上说,将一个 FSFS 格式的版本库放在网络中共享,并且多用户通过 file:// 协议访问是可以的。但这样做是非常妥当的。事实上我们强烈反对这样做,并且不支持这样的用法。

首先,这样赋予所有用户对版本库的写权限,所以任何一个用户都可能意外的删除整个版本库,或者因为别的问题导致版本库不可用。

其次,不是所有的网络文件共享协议都支持 Subversion 需要的文件锁定,所以你会发现你的版本库被毁了。它也许不会马上发生,但是总有一天会有 2 个用户同时访问版本库。

第三,文件的权限必需设置得井井有条。也许 Windows 的共享可以避开这个问题,但是在 SAMBA 中却是相当困难的。

file:// 访问是为本机工作而准备的,只能单用户访问,特别是测试和调试。当你打算共享版本库的时候,你真的需要设置一个适当的服务器,而且它并不像你想象的那样困难。阅读“Accessing the Repository”一节获得选择指南,并配置服务器。

版本库布局

在将你的数据导入到版本库之前,首先你得考虑如何组织你的数据。如果你使用一种推荐的布局,你在后面的操作将会更容易许多。

There are some standard, recommended ways to organize a repository. Most people create a trunk directory to hold the “main line” of development, a branches directory to contain branch copies, and a tags directory to contain tag copies. If a repository holds only one project, then often people create these top-level directories:

/trunk
/branches
/tags

Because this layout is so commonly used, when you create a new repository using TortoiseSVN, it will also offer to create the directory structure for you.

如果一个版本库包含多个项目,人们通常按分支来安排布局:

/trunk/paint
/trunk/calc
/branches/paint
/branches/calc
/tags/paint
/tags/calc

……或者按项目:

/paint/trunk
/paint/branches
/paint/tags
/calc/trunk
/calc/branches
/calc/tags

如果项目不是密切相关,而且每一个是单独被检出,那么按项目布局是合理的。对于那些你想一次检出所有项目,或需要将它们打成一个分发包的相关项目,按分支来布局通常比较好。这种方式你只要检出一个分支,而且子项目之间的关系也比较清楚。

如果你采用顶层/trunk /tags /branches这种方式,并不意味着你必须复制整个主线为分支或标签,而且某些情况下这种结构更具灵活性。

对于不相关的项目,你可能更愿意使用不同的版本库。当你提交时,改变的是整个版本库的修订号,而不是项目的。让两个不相关的项目共用一个版本库,会导致修订号出现较大的跳跃。Subversion和TortoiseSVN项目看起来是在同一个主机地址,但是它们是在完全独立的版本库中开发着,并且版本号也不相干。

当然,你完全可以不理会上面提及的通用布局。你可以自由改变,来满足你和你团队的需要。请记住,不管你选择哪种布局,它都不是永久的。你可以在随时重新组织你的版本库。因为分支和标签是普通的目录,只要你愿意,TortoiseSVN可以将它们移动或重命名。

从一种布局转换到另一种布局仅仅是在服务器端移动一些文件或目录;如果你不喜欢版本库的组织形式,仅管大胆地修改那些目录。

因此,如果你还没有在版本库中创建基本的文件夹结构,你应该立刻创建。创建文件夹有 2 种方法。如果你只想创建一个 /trunk /tags /branches 结构,你可以使用版本库浏览器创建这 3 个文件夹(独立的 3 次提交)。如果你想创建一个层次更深的结构,那么更简单的做法是先在硬盘中创建好文件夹结构,然后将其导入(只有 1 次提交),就像这样:

  1. 在你的硬盘上创建一个空的文件夹

  2. 在那个文件夹下创建你想要的顶级目录--千万不要放任何文件进去!

  3. import this structure into the repository via a right click on the folder that contains this folder structure and selecting TortoiseSVNImport... In the import dialog enter the URL to your repository and click OK. This will import your temp folder into the repository root to create the basic repository layout.

注意,你所导入的那个文件夹的名字并不存在于版本库中,仅仅是它所包含的内容。比如,创建如下结构的文件夹

C:\Temp\New\trunk
C:\Temp\New\branches
C:\Temp\New\tags

导入C:\Temp\New到版本库的根目录,版本库中将会是这样:

/trunk
/branches
/tags