本文档旨在描述 Apache™ Subversion® 的 1.7.x 系列。如果您运行的是其他版本的 Subversion,强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的文档。

分支维护

您可能已经注意到,Subversion 非常灵活。因为它使用相同的底层机制(目录复制)来实现分支和标签,并且分支和标签出现在正常的 文件系统空间中,许多人发现 Subversion 很吓人。它几乎 灵活了。在本节中,我们将提供一些关于如何随着时间的推移来安排和管理数据的建议。

仓库布局

有一些标准的、推荐的组织仓库内容的方法。大多数人创建一个 trunk 目录来保存 主线 开发,一个 branches 目录来保存分支副本,以及一个 tags 目录来保存标签副本。如果仓库只保存一个项目,通常人们会创建这些顶级目录


/
   trunk/
   branches/
   tags/

如果仓库包含多个项目,管理员通常会按项目索引其布局。请参阅 名为“规划仓库组织”的部分 以了解更多关于 项目根目录 的信息,但以下是一个此类布局的示例


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

当然,您可以自由地忽略这些常见的布局。您可以创建任何类型的变体,无论对您或您的团队最有效。请记住,无论您选择什么,它都不是永久的承诺。您可以随时重新组织您的仓库。因为分支和标签是普通的目录,所以 svn move 命令可以按您希望的方式移动或重命名它们。从一种布局切换到另一种布局只是发出一系列服务器端移动的问题;如果您不喜欢仓库中事物的组织方式,只需将目录四处移动即可。

请记住,虽然移动目录很容易,但您也需要考虑其他用户。您的操作可能会让使用现有工作副本的用户感到困惑。如果用户拥有特定存储库目录的工作副本,而您的 svn move 子命令从最新版本中删除了该路径,那么当用户下次运行 svn update 时,系统会告诉他们他们的工作副本代表的是一个不再存在的路径。然后,他们被迫使用 svn switch 切换到新位置。

数据生命周期

Subversion 模型的另一个优点是,分支和标签可以像其他任何版本化的项目一样具有有限的生命周期。例如,假设您最终完成了对 calc 项目的个人分支的所有工作。在将所有更改合并回 /calc/trunk 后,您无需再保留私有分支目录。

$ svn delete http://svn.example.com/repos/calc/branches/my-calc-branch \
             -m "Removing obsolete branch of calc project."

Committed revision 375.

现在您的分支消失了。当然,它并没有真正消失:该目录只是从 HEAD 版本中消失了,不再分散任何人的注意力。如果您使用 svn checkoutsvn switchsvn list 检查早期版本,您仍然可以看到旧的分支。

如果浏览已删除的目录还不够,您始终可以将其恢复。在 Subversion 中,恢复数据非常容易。如果您想将已删除的目录(或文件)恢复到 HEAD,只需使用 svn copy 从旧版本复制它即可。

$ svn copy http://svn.example.com/repos/calc/branches/my-calc-branch@374 \
           http://svn.example.com/repos/calc/branches/my-calc-branch \
           -m "Restore my-calc-branch."

Committed revision 376.

在我们的示例中,您的个人分支的生命周期相对较短:您可能创建它来修复错误或实现新功能。当您的任务完成时,分支也随之完成。然而,在软件开发中,通常会并行运行两个 分支,而且持续时间很长。例如,假设现在是将 calc 项目的稳定版本发布给公众的时候了,并且您知道需要几个月的时间才能消除软件中的错误。您不希望人们向项目添加新功能,但也不想告诉所有开发人员停止编程。因此,您创建了一个 稳定 的软件分支,该分支不会发生太大变化。

$ svn copy http://svn.example.com/repos/calc/trunk \
           http://svn.example.com/repos/calc/branches/stable-1.0 \
           -m "Creating stable branch of calc project."

Committed revision 377.

现在,开发者可以自由地继续向 /calc/trunk 添加尖端(或实验性)功能,并且您可以声明一个项目策略,即只有错误修复才能提交到 /calc/branches/stable-1.0。也就是说,随着人们继续在主干上工作,有人会选择性地将错误修复移植到稳定分支。即使稳定分支已经发布,您可能也会继续维护该分支很长时间——也就是说,只要您继续为客户提供该版本的支持。我们将在下一节中详细讨论这个问题。