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

将数据导入您的仓库

您可以通过两种方式将新文件导入 Subversion 仓库:svn importsvn 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 还禁止路径名中的 TABCRLF 字符,以防止路径在差异中或在 svn logsvn status 等命令的输出中被分割。

虽然看起来需要记住很多东西,但实际上这些限制很少会成为问题。只要您的区域设置与 UTF-8 兼容,并且您在路径名中不使用控制字符,您应该能够与 Subversion 顺利通信。命令行客户端会提供额外的帮助——为了创建供内部使用的合法正确版本,它会自动在您键入的 URL 中对非法路径字符进行必要的转义。