本文档编写用于描述 Subversion 1.1。如果您运行的是更新版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的书籍。

添加项目

创建并配置仓库后,剩下的就是开始使用它了。如果您有一组现有的数据准备置于版本控制之下,您很可能希望使用 svn 客户端程序的import子命令来完成这项任务。但是,在执行此操作之前,您应该仔细考虑仓库的长期计划。在本节中,我们将提供一些关于如何规划仓库布局以及如何将数据排列在该布局中的建议。

选择仓库布局

虽然 Subversion 允许您移动版本化的文件和目录而不会丢失任何信息,但这样做仍然会中断经常访问仓库并期望事物位于特定位置的人的工作流程。试着展望未来一点;在将数据置于版本控制之下之前提前计划。通过“布局”仓库内容的有效方式,您可以防止将来出现许多问题。

在设置 Subversion 仓库时,需要考虑一些因素。假设作为仓库管理员,您将负责为多个项目提供版本控制系统的支持。第一个决定是使用单个仓库来存放多个项目,还是为每个项目提供一个独立的仓库,或者在这两者之间进行折衷。

使用单个仓库存放多个项目有很多好处,最明显的是缺乏重复维护。单个仓库意味着只有一组钩子脚本,只有一项需要定期备份,只有一项需要转储和加载(如果 Subversion 发布了不兼容的新版本),等等。此外,您还可以轻松地在项目之间移动数据,而不会丢失任何历史版本信息。

使用单个仓库的缺点是,不同的项目可能具有不同的提交邮件列表或不同的身份验证和授权要求。此外,请记住,Subversion 使用仓库全局修订号。有些人不喜欢这样一个事实,即使他们的项目最近没有进行任何更改,仓库的最新修订号也会不断增加,因为其他项目正在积极添加新的修订版。

也可以采取折衷的方法。例如,可以根据项目之间的相关性对项目进行分组。您可能会有几个仓库,每个仓库中包含少量项目。这样,可能需要共享数据的项目就可以轻松地进行共享,而且随着仓库中添加新的修订版,至少开发人员知道这些新的修订版至少与使用该仓库的所有人相关。

决定好如何组织项目的仓库后,您可能还想考虑仓库本身的目录层次结构。由于 Subversion 使用常规的目录副本进行分支和标记(参见 第 4 章,分支和合并),Subversion 社区建议您为每个 项目根目录 选择一个仓库位置——包含与该项目相关数据的“最顶层”目录——然后在该根目录下创建三个子目录trunk,表示进行主要项目开发的目录;branches,这是一个目录,用于创建主开发线上的各种命名分支;tags,这是一个目录,用于存储创建的、可能被销毁的、但从未更改的分支。

例如,您的仓库可能如下所示

/
   calc/
      trunk/
      tags/
      branches/
   calendar/
      trunk/
      tags/
      branches/
   spreadsheet/
      trunk/
      tags/
      branches/
   …

请注意,项目根目录在仓库中的位置并不重要。如果每个仓库只有一个项目,那么将每个项目根目录放在其各自仓库的根目录是最合理的位置。如果您有多个项目,您可能希望在仓库中对它们进行分组,例如将具有相似目标或共享代码的项目放在同一个子目录中,或者可能只是按字母顺序对它们进行分组。这种安排可能如下所示

/
   utils/
      calc/
         trunk/
         tags/
         branches/
      calendar/
         trunk/
         tags/
         branches/
      …
   office/
      spreadsheet/
         trunk/
         tags/
         branches/
      …

以您认为合适的方式布局您的仓库。Subversion 不期望或强制执行布局模式——在它看来,目录就是目录。最终,您应该选择满足在该仓库中工作的项目的开发人员需求的仓库安排。

创建布局,并导入初始数据

决定好如何在仓库中组织项目后,您可能希望实际使用该布局并将初始项目数据填充到仓库中。在 Subversion 中,有几种方法可以做到这一点。您可以使用 svn mkdir 命令(参见 第 9 章,Subversion 完整参考)逐个创建仓库骨架布局中的每个目录。完成相同任务的更快方法是使用 svn import 命令(参见 名为“svn import”的部分)。通过首先在驱动器上的临时位置创建布局,您可以在一次提交中将整个布局树导入到仓库中

$ mkdir tmpdir
$ cd tmpdir
$ mkdir projectA
$ mkdir projectA/trunk
$ mkdir projectA/branches
$ mkdir projectA/tags
$ mkdir projectB
$ mkdir projectB/trunk
$ mkdir projectB/branches
$ mkdir projectB/tags
…
$ svn import . file:///path/to/repos --message 'Initial repository layout'
Adding         projectA
Adding         projectA/trunk
Adding         projectA/branches
Adding         projectA/tags
Adding         projectB
Adding         projectB/trunk
Adding         projectB/branches
Adding         projectB/tags
…
Committed revision 1.
$ cd ..
$ rm -rf tmpdir
$

您可以通过运行 svn list 命令来验证导入结果

$ svn list --verbose file:///path/to/repos
      1 harry               May 08 21:48 projectA/
      1 harry               May 08 21:48 projectB/
…
$

一旦您有了骨架布局,您就可以开始将实际的项目数据导入到仓库中(如果存在任何此类数据)。同样,也有多种方法可以做到这一点。您可以使用 svn import 命令。您可以从新的仓库中检出一个工作副本,将项目数据移动并排列在工作副本中,然后使用 svn addsvn commit 命令。但是一旦我们开始讨论这些问题,我们就不是在讨论仓库管理了。如果您还不熟悉 svn 客户端程序,请参见 第 3 章,导览.