本文档用于描述 Subversion 1.4。如果您正在运行更新版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的本书版本。
在任何给定的工作副本中,除了所有已版本控制的文件和目录之外,还有很大可能性存在其他既未版本控制也并非旨在版本控制的文件和目录。文本编辑器会在目录中留下备份文件。软件编译器会生成中间(甚至最终)文件,这些文件通常您不会费心版本控制。用户自己也会将各种其他文件和目录随意放置,通常是在版本控制工作副本中。
期望 Subversion 工作副本在某种程度上不受此类混乱和杂乱的影响是不切实际的。事实上,Subversion 认为将其工作副本视为典型目录(就像未版本控制的树一样)是其功能。但是,这些不应版本控制的文件和目录可能会给 Subversion 用户带来一些困扰。例如,由于 svn add 和 svn import 命令默认情况下递归执行,并且不知道您想在给定树中版本控制哪些文件,因此很容易意外地将不想版本控制的内容添加到版本控制中。而且,由于 svn status 默认情况下会报告工作副本中所有感兴趣的项目(包括未版本控制的文件和目录),因此在存在很多此类项目的情况下,其输出可能会变得相当嘈杂。
因此,Subversion 提供了两种方法来告诉它哪些文件您希望它简单地忽略。其中一种方法涉及使用 Subversion 的运行时配置系统(参见 名为“Runtime Configuration Area”的部分),因此适用于所有使用该运行时配置的 Subversion 操作,通常是针对特定计算机或特定计算机用户执行的操作。另一种方法利用 Subversion 的目录属性支持,更紧密地绑定到版本控制树本身,因此影响了拥有该树工作副本的每个人。这两种机制都使用文件模式。
Subversion 运行时配置系统提供了一个选项 global-ignores,其值是文件模式的空格分隔集合(也称为globs)。Subversion 客户端会将这些模式与要添加到版本控制的文件的名称进行比较,以及 svn status 命令注意到的未版本控制的文件。如果任何文件的名称与其中一个模式匹配,Subversion 将基本上像文件不存在一样对待它。对于您几乎从不想版本控制的那些文件类型(例如编辑器备份文件,如 Emacs 的 *~ 和 .*~ 文件)来说,这非常有用。
在版本控制目录中找到时,svn:ignore 属性应包含一个换行符分隔的文件模式列表,Subversion 应使用这些模式来确定同一目录中可忽略的对象。这些模式不会覆盖在 global-ignores 运行时配置选项中找到的模式,而是附加到该列表中。值得再次注意的是,与 global-ignores 选项不同,svn:ignore 属性中找到的模式仅适用于设置该属性的目录,而不适用于其任何子目录。svn:ignore 属性是告诉 Subversion 忽略所有用户工作副本中该目录中可能存在的文件(例如,编译器输出或——为了使用更适合本书的示例——将某些源 DocBook XML 文件转换为更易读的输出格式所生成的 HTML、PDF 或 PostScript 文件)的一种好方法。
Subversion 对可忽略文件模式的支持仅限于将未版本控制的文件和目录添加到版本控制的一次性过程。一旦对象在 Subversion 的控制之下,忽略模式机制将不再对其适用。换句话说,不要期望 Subversion 仅仅因为文件的名称与忽略模式匹配而避免提交对已版本控制文件的更改——Subversion始终会注意到其所有已版本控制的对象。
全局忽略模式列表往往更多地是个人喜好问题,并且与用户特定的工具链密切相关,而不是与任何特定工作副本需求的细节密切相关。因此,本节的其余部分将重点关注 svn:ignore 属性及其用途。
假设您有来自 svn status 的以下输出
$ svn status calc M calc/button.c ? calc/calculator ? calc/data.c ? calc/debug_log ? calc/debug_log.1 ? calc/debug_log.2.gz ? calc/debug_log.3.gz
在这个示例中,您对 button.c 进行了某些属性修改,但在您的工作副本中,您还有某些未版本控制的文件:您从源代码编译的最新 calculator 程序、名为 data.c 的源文件,以及一组调试输出日志文件。现在,您知道您的构建系统始终会导致生成 calculator 程序。[13] 您也知道您的测试套件始终会留下那些调试日志文件。这些事实适用于此项目的每个工作副本,而不仅仅是您自己的工作副本。您知道您不希望每次运行 svn status 时都看到那些东西,并且确信其他人也不想看到它们。因此,您使用 svn propedit svn:ignore calc 向 calc 目录添加一些忽略模式。例如,您可以将以下内容添加为 svn:ignore 属性的新值
calculator debug_log*
添加此属性后,您现在将对 calc 目录进行本地属性修改。但是请注意,您的 svn status 输出还有哪些不同
$ svn status M calc M calc/button.c ? calc/data.c
现在,所有这些垃圾都从输出中消失了!当然,您的 calculator 编译程序和所有那些日志文件仍然在您的工作副本中。Subversion 只是没有提醒您它们存在并且未版本控制。现在,由于从显示中删除了所有不重要的噪音,您只剩下更有趣的项目——例如,您可能忘记添加到版本控制的源代码文件 data.c。
当然,这不是您可以获得的唯一一种工作副本状态的简明报告。如果您确实希望将被忽略的文件作为状态报告的一部分,您可以将 --no-ignore 选项传递给 Subversion
$ svn status --no-ignore M calc M calc/button.c I calc/calculator ? calc/data.c I calc/debug_log I calc/debug_log.1 I calc/debug_log.2.gz I calc/debug_log.3.gz
如前所述,忽略文件模式列表也由 svn add 和 svn import 使用。这两个操作都涉及要求 Subversion 开始管理一组文件和目录。Subversion 不会强迫用户选择要开始版本控制的树中的哪些文件,而是使用忽略模式(全局列表和每个目录列表)来确定哪些文件不应作为更大递归添加或导入操作的一部分被吸收到版本控制系统中。同样,您可以使用 --no-ignore 选项告诉 Subversion 忽略其忽略列表并对所有存在的文件和目录进行操作。