存储库指示配置 - 第 3 部分(共 3 部分):全局忽略

本文已获得原始位置 http://blogs.collab.net/subversion/repository-dictated-configuration-day-3-global-ignores 的许可,并在此处镜像。已删除或更新了无效链接。

作者:Paul Burba

发布 2013-06-26

欢迎来到我的关于存储库指示配置 (RDC) 的三部分系列的最后一部分。在第 2 部分中,我们讨论了新的 svn:auto-props 属性。今天我们将讨论另一个涉及 RDC 的新继承属性,svn:global-ignores

在 1.8 之前忽略未版本化的项目

再次强调,这只是一个快速回顾,如果您对这些内容不熟悉,请快速阅读 版本控制与 Subversion 一书中的这一部分

在 1.7 之前,有两种方法可以防止 svn add 和 import 子命令添加我们不想置于版本控制下的某些项目(以及使 svn status 忽略此类未版本化的项目)。这两种方法在 1.8 中仍然存在。

首先是全局忽略运行时配置选项

### Set global-ignores to a set of whitespace-delimited globs
### which Subversion will ignore in its 'status' output, and
### while importing or adding files and directories.
### '*' matches leading dots, e.g. '*.rej' matches '.foo.rej'.
global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__ *.rej *~ #*# .#* .*.swp .DS_Store

第二个是svn:ignore 版本控制属性。该属性可以在任何目录上设置,其值应为一个换行符分隔的、Subversion 应该忽略的文件模式列表。这些模式将附加到运行时配置中定义的任何忽略模式。

svn:global-ignores 属性

在 Subversion 1.8 中,这些现有的忽略机制通过svn:global-ignores 属性合并。这个新属性本质上是svn:ignore 属性的更强大版本。与之前的属性一样,svn:global-ignores 只能在目录上设置,其值应为一组换行符分隔的文件模式 1。这些模式将附加到 global-ignores 运行时配置选项中定义的任何模式以及任何适用的svn:ignore 定义模式,以确定可忽略的项目。然而,与svn:ignore 不同的是,svn:global-ignores 属性是可继承的,并应用于设置该属性的目录下的所有路径 2,而不仅仅是目录的直接子级。

以下简短示例演示了此新属性的工作原理。

当使用--no-ignore 选项时,svn:global-ignores 模式本身会被忽略(运行时配置 global-ignores 和 svn:ignore 属性也是如此)。因此,要查看工作副本中的所有未版本控制的项目,我们将该选项传递给 status 子命令

1.8.0>svn st --no-ignore
?       calc\trunk\doc\README.foo
I       calc\trunk\file.bar
I       calc\trunk\file.baz
I       calc\trunk\file.foo
I       calc\trunk\file.qux

在这里,我们看到四个文件被忽略,而一个(README.foo)未版本控制,但与任何忽略模式都不匹配。首先,让我们看看 calc/trunk 上的 svn:ignore 属性

1.8.0>svn pg svn:ignore -vR
Properties on 'calc\trunk':
  svn:ignore
    *.foo
    *.moo

这解释了 file.foo。然后我们检查我们的运行时配置,发现这段代码

### Set global-ignores to a set of whitespace-delimited globs
### which Subversion will ignore in its 'status' output, and
### while importing or adding files and directories.
### '*' matches leading dots, e.g. '*.rej' matches '.foo.rej'.
global-ignores = *.qux

这解释了 file.qux。但是 file.bar 和 file.baz 呢?只剩下一个选项,那就是新的 svn:global-ignores 属性。果然,在存储库的根目录中,我们找到了该属性,其中包含解释了剩余两个被忽略文件的模式

1.8.0>svn pg svn:global-ignores -v --show-inherited-props calc\trunk
Inherited properties on 'calc\trunk',
from '.':
  svn:global-ignores
    *.bar
    *.baz

最后的想法

正如我们在第二部分关于 svn:auto-props 中讨论的那样,svn:global-ignores 应该尽可能地设置在存储库树的较高位置。  并且值得最后一次提及:确保您了解第一部分中讨论的继承属性的局限性——因此通过 svn:auto-propssvn:global-ignores 实现 RDC 的局限性。

注释:

  1. 最初的意图是 svn:global-ignores 属性中的忽略模式可以用任何空格分隔(类似于 global-ignores 运行时配置选项),而不仅仅是换行符(与 svn:ignore 属性一样),但在 1.8.0 中存在一个错误,只有换行符分隔的模式有效。

  2. 我之前在第一部分中提到的关于继承属性的注意事项当然仍然适用!

关于作者

Paul 是 Apache 软件基金会 Subversion 项目的提交者,过去九年一直在从事 Subversion 的工作。他作为 Collabnet 的软件工程师在家乡新罕布什尔州工作,在不写代码的时候,他通常会和侄子们一起滑雪,和朋友们一起骑山地自行车,或者和妻子一起旅行。在遥远的过去,Paul 从新罕布什尔大学获得了商业学位。最近,他获得了波士顿大学的计算机科学硕士学位。

TortoiseSVN 官方中文版 1.14.7 发布