本文档用于描述 Subversion 1.2。如果您运行的是更新版本的 Subversion,我们强烈建议您访问 https://svnbooks.subversion.org.cn/ 并参考与您的 Subversion 版本相符的版本。
创建和配置仓库后,剩下的就是开始使用它了。如果您有一组现有的数据准备放置在版本控制下,您很可能想使用 svn 客户端程序的 import
子命令来完成此操作。但是,在执行此操作之前,您应该仔细考虑对仓库的长期规划。在本节中,我们将提供一些关于如何规划仓库布局以及如何将数据排列到该布局中的建议。
虽然 Subversion 允许您在不丢失任何信息的情况下移动版本化的文件和目录,但这样做仍然会扰乱经常访问仓库并期望事物位于特定位置的人的工作流程。尝试稍微展望未来;在将数据置于版本控制之下之前提前计划。通过在第一次“布局”仓库内容的方式,可以避免以后出现很多麻烦。
在设置 Subversion 仓库时,需要考虑以下几点。假设作为仓库管理员,您将负责支持多个项目的版本控制系统。第一个决定是使用单个仓库还是为每个项目提供一个仓库,或者这两种方法的折衷方案。
使用单个仓库存储多个项目有很多好处,最明显的是没有重复维护。单个仓库意味着只有一组钩子脚本,一个要定期备份的东西,一个在 Subversion 发布不兼容的新版本时要转储和加载的东西,等等。此外,您还可以轻松地在项目之间移动数据,而不会丢失任何历史版本信息。
使用单个仓库的缺点是,不同的项目可能具有不同的提交邮件列表或不同的身份验证和授权要求。另外,请记住 Subversion 使用仓库级别的修订号。有些人不喜欢这样的事实:即使最近没有对他们的项目进行任何更改,仓库的最新修订号仍在不断攀升,因为其他项目正在积极添加新的修订。
也可以采用折中的方法。例如,可以根据项目之间的相关性对项目进行分组。您可能拥有几个仓库,每个仓库包含一些项目。这样,可能需要共享数据的项目可以轻松地做到这一点,并且随着新修订添加到仓库中,至少开发人员知道这些新修订至少与使用该仓库的所有人相关。
在决定如何组织项目与仓库的关系之后,您可能希望考虑仓库本身的目录层次结构。由于 Subversion 使用常规目录复制来进行分支和标记(参见 第 4 章,分支和合并),Subversion 社区建议您为每个 项目根目录 选择一个仓库位置——包含与该项目相关数据的“最上层”目录——然后在该根目录下创建三个子目录:trunk
,表示发生主要项目开发的目录;branches
,这是一个创建主要开发线各种命名分支的目录;tags
,这是一个创建的分支的目录,这些分支可能会被销毁,但永远不会被更改。[21]
例如,您的仓库可能看起来像这样
/ 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 add 和 svn commit 命令。但是,一旦我们开始谈论这些事情,我们就不再讨论仓库管理了。如果您还不熟悉 svn 客户端程序,请参见 第 3 章,导览。