本手册编写用于描述 Subversion 的 1.6.x 系列。如果您运行的是其他版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的文档。
您可以通过两种方式将新文件导入到 Subversion 版本库:svn import 和 svn add。我们现在将讨论 svn import,并在本章后面回顾 Subversion 的典型操作时讨论 svn add。
命令 svn import 是一种将未版本化的文件树快速复制到版本库中的方法,它会根据需要创建中间目录。svn import 不需要工作副本,您的文件会立即提交到版本库。当您拥有一个现有的文件树并希望将其开始跟踪到 Subversion 版本库中时,通常会使用此方法。例如
$ svn import /path/to/mytree \ http://svn.example.com/svn/repo/some/project \ -m "Initial import" Adding mytree/foo.c Adding mytree/bar.c Adding mytree/subdir Adding mytree/subdir/quux.h Committed revision 1. $
前面的示例将本地目录 mytree
的内容复制到版本库中目录 some/project
。请注意,您无需先创建该新目录,svn import 会为您完成此操作。提交完成后,您可以在版本库中看到您的数据
$ svn list http://svn.example.com/svn/repo/some/project bar.c foo.c subdir/ $
请注意,导入完成后,原始本地目录不会转换为工作副本。要以版本控制的方式开始处理这些数据,您仍然需要创建该树的新工作副本。
Subversion 在如何安排数据方面提供了最大的灵活性。因为它只是版本化目录和文件,并且不为任何这些对象赋予任何特定含义,因此您可以选择以任何方式安排版本库中的数据。不幸的是,这种灵活性也意味着,当您尝试导航不同的 Subversion 版本库时,很容易发现自己“没有路线图就迷路了”,因为这些版本库可能包含完全不同且不可预测的数据安排。
为了消除这种混乱,我们建议您遵循版本库布局约定(早在 Subversion 项目的初期就已经建立),其中几个战略性命名的 Subversion 版本库目录传达了有关其所包含数据的有价值的信息。大多数项目都有一个可识别的“主线”,即主干,以及一些分支,它们是开发线的不同副本,以及一些标签,它们是特定开发线的已命名稳定快照。因此,我们首先建议每个项目在版本库中都有一个可识别的项目根目录,该目录下包含该项目的所有版本控制信息,并且仅包含该项目的版本控制信息。其次,我们建议每个项目根目录包含一个用于主开发线的 trunk
子目录,一个用于创建特定分支(或分支集合)的 branches
子目录,以及一个用于创建特定标签(或标签集合)的 tags
子目录。当然,如果版本库只包含一个项目,那么版本库的根目录也可以作为项目根目录。
以下是一些示例
$ svn list file:///var/svn/single-project-repo trunk/ branches/ tags/ $ svn list file:///var/svn/multi-project-repo project-A/ project-B/ $ svn list file:///var/svn/multi-project-repo/project-A trunk/ branches/ tags/ $
我们将在 第 4 章,分支和合并 中详细介绍标签和分支。有关在有多个项目时如何设置版本库的详细信息和一些建议,请参阅 名为“版本库布局”的部分。最后,我们将在 名为“规划您的版本库组织”的部分 中详细介绍项目根目录。
Subversion 尽力不限制您可以放置在版本控制下的数据类型。文件内容和属性值以二进制数据存储和传输,并且 名为“文件内容类型”的部分 向您说明如何向 Subversion 提示“文本” 操作对特定文件没有意义。但是,在某些地方,Subversion 会对存储的信息进行限制。
Subversion 在内部处理某些数据位,例如属性名称、路径名和日志消息,它们以 UTF-8 编码的 Unicode 形式存储。但这并不意味着您与 Subversion 的所有交互都必须使用 UTF-8。作为一般规则,Subversion 客户端将优雅且透明地处理 UTF-8 与您计算机上使用的编码系统之间的转换,如果可以有意义地进行此类转换(对于今天使用的最常见编码而言,情况确实如此)。
在 WebDAV 交换和某些 Subversion 管理文件的旧版本中,路径用作 XML 属性值,属性名称用作 XML 标签名称。这意味着路径名只能包含合法的 XML(1.0)字符,属性进一步限制为 ASCII 字符。Subversion 还禁止在路径名中使用 TAB
、CR
和 LF
字符,以防止路径在差异或 svn log 或 svn status 等命令的输出中被拆分。
虽然这似乎需要记住很多东西,但在实践中,这些限制很少会成为问题。只要您的区域设置与 UTF-8 兼容,并且您不在路径名中使用控制字符,您就应该能够毫无问题地与 Subversion 进行通信。命令行客户端提供了额外的帮助 - 为了创建用于内部使用的“合法正确” 版本,它将自动在您键入的 URL 中对非法路径字符进行必要的转义。