本文档正在编写中,内容可能会发生很大变化,可能无法准确描述 Apache™ Subversion® 软件的任何已发布版本。将此页面添加书签或以其他方式推荐给其他人可能不是一个好主意。请访问 https://svnbooks.subversion.org.cn/ 获取本书的稳定版本。

将数据导入您的版本库

您可以通过两种方式将新文件导入 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 中根据需要自动转义不合法的路径字符。

[Warning] 警告

当然,在选择有效的路径名时,Subversion 并不是唯一的限制因素。使用多个操作系统的团队也需要考虑这些操作系统对路径名施加的限制。例如,虽然 Windows 禁止在文件名中使用冒号字符,但 Linux 系统上的用户可以非常轻松地将此类文件添加到版本控制中,从而导致数据集无法再在 Windows 上签出。将多个文件添加到名称仅在字母大小写上不同的目录中也会导致在区分大小写的文件系统上签出工作副本的用户遇到问题。因此,建议对不同操作系统和文件系统引入的各种限制有所了解。

TortoiseSVN 官方中文版 1.14.7 发布