本文档编写用于描述 Subversion 1.2。如果您运行的是更新版本的 Subversion,我们强烈建议您访问 https://svnbooks.subversion.org.cn/ 并查阅与您 Subversion 版本相对应的版本。
您可能已经注意到 Subversion 非常灵活。因为它使用相同的底层机制(目录复制)来实现分支和标签,并且分支和标签出现在正常的 文件系统空间中,许多人发现 Subversion 令人望而生畏。它几乎太灵活了。在本节中,我们将提供一些建议,用于随着时间的推移来组织和管理您的数据。
有一些标准的、推荐的组织仓库的方法。大多数人创建一个 trunk
目录来保存开发的“主线”,一个 branches
目录来保存分支副本,以及一个 tags
目录来保存标签副本。如果一个仓库只保存一个项目,那么通常人们会创建这些顶级目录
/trunk /branches /tags
如果一个仓库包含多个项目,管理员通常会按项目索引他们的布局(参见 名为“选择仓库布局”的部分 以了解有关“项目根目录”的更多信息)
/paint/trunk /paint/branches /paint/tags /calc/trunk /calc/branches /calc/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 checkout、svn switch 或 svn list 检查更早的修订版,您仍然可以查看您的旧分支。
如果浏览您已删除的目录还不够,您始终可以将其恢复。在 Subversion 中恢复数据非常容易。如果您想将已删除的目录(或文件)恢复到 HEAD
中,只需使用 svn copy -r 从旧修订版中复制它
$ svn copy -r 374 http://svn.example.com/repos/calc/branches/my-calc-branch \ http://svn.example.com/repos/calc/branches/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
。也就是说,随着人们继续在 trunk 上工作,人类会选择性地将错误修复移植到稳定分支。即使在稳定分支发布后,您可能也会在很长一段时间内继续维护该分支——也就是说,只要您继续为客户支持该版本。