第 3 章 版本库

目录

创建版本库
使用命令行工具创建版本库
使用 TortoiseSVN 创建版本库
本地访问版本库
访问网络共享磁盘上的版本库
版本库布局
版本库备份
服务器端钩子脚本
检出链接
访问版本库

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

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

创建版本库

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

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

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

  3. 打开命令提示符(或DOS窗口),跳转到D:\SVN\目录,输入

    svnadmin create --fs-type bdb MyNewRepository
    

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

使用 TortoiseSVN 创建版本库

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

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

  1. 打开资源管理器

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

  3. 右键单击 新建的文件夹并选择 TortoiseSVN在此创建版本库...

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

    你会被询问是否要在版本库中创建目录结构。要获得关于目录结构的选项情参阅 “版本库布局”一节

    TortoiseSVN 将会在创建版本库时为其设置一个特定的文件夹图标,便于辨别本地版本库。如果使用官方的命令行客户端创建版本库则不会设置文件夹图标。

提示

除非是基于本地测试的目的,我们推荐你完全不要使用 field:// 访问。对于除独立开发者以外的人而言,使用服务器更安全更可靠。

本地访问版本库

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

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

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

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

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

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

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

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

  • 如果有人安装新版客户端升级了版本库格式,那么其他人将无法访问该版本库,直到他们也升级到新版客户端。

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

版本库布局

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

有一些标准的,推荐使用的组织版本库结构的方法。大多数人创建一个 trunk 目录掌管开发的 主干,一个 branches 目录存放分支副本,以及一个 tags 目录存放标记副本。如果一个版本库只掌管一个项目,那么人们通常创建这些顶级目录:

/trunk
/branches
/tags
    

因为这个布局非常通用,所以当使用 TortoiseSVN 创建版本库时,它会提出帮你创建这个目录结构。

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

/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. 将这个结构导入版本库中,只需 右键单击 包含这个结构的文件夹并选择 TortoiseSVN导入...。在导入对话框中输入版本库的 URL 并单击确定。这样就会将临时文件夹导入版本库中创建基本布局。

请注意你导入的文件夹名不会显示在版本库中,只有文件夹的内容。例如,创建如下文件夹结构

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

导入C:\Temp\New的版本库根目录,之后应该像这样:

/trunk
/branches
/tags