本文档旨在描述 Apache™ Subversion® 的 1.7.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 中对非法路径字符进行必要的转义。