仓库配置指南 - 第 2 部分(共 3 部分):自动属性

本文经原网站 http://blogs.collab.net/subversion/the-road-to-repository-dictated-configuration-day-2-autoprops 授权转载。失效链接已移除或更新。

作者:Paul Burba

发布日期 2013-06-25

自动属性

在第一部分中,我谈到了 Subversion 1.8 中新的可继承属性功能。我承诺此功能将为仓库配置指南 (RDC) 铺平道路。今天,我将向您展示 1.8 中与 RDC 相关的第一个功能,即新的 svn:auto-props 属性。

等等…RDC 到底是什么?

Subversion 提供了一套广泛的 用户可配置选项,用于控制 Subversion 客户端操作的各个方面。对于只有少数几个在同一地点的提交者的仓库,手动同步这些配置可能并不太难。但是,对于更大或分布式团队,确保每个人都拥有相同的配置变得越来越麻烦。Subversion 提供了一种机制,可以通过 钩子脚本 来强制执行其中一些配置。但是,钩子脚本本质上只提供事后强制执行 - 钩子脚本可以拒绝对配置不当的用户进行提交,但它不会纠正用户的配置。

更好的解决方案是**由仓库决定的配置**1,这些配置无缝地补充了客户端的配置,并使用适用于直接在仓库上操作以及通过仓库工作副本间接操作的仓库范围设置。在这个领域中最常被请求的功能之一是用于自动属性设置的仓库决定的值,Subversion 1.8 通过新的保留属性 `svn:auto-props` 提供了此功能。

1.8 之前的自动属性

这是一个高级的复习,有关更多详细信息,请参阅 使用 Subversion 进行版本控制手册

在 Subversion 1.7 中,当您使用 `svn add` 或 `svn import` 子命令将文件添加到版本控制时,Subversion 会尝试自动在该文件上设置通用属性。其中一些属性(例如 `svn:executable`、`svn:mime-type`)无论配置如何都会被设置,而另一些属性(例如 `svn:eol-style`)2 则取决于您的个人运行时配置的具体情况。这些配置可以在命令行中使用 `–config-option` 和 `–config-dir` 选项覆盖。

我们今天感兴趣的配置部分是 auto-props。在本节中,您可以定义在添加/导入文件时自动设置的属性。例如,假设我们有以下配置3

### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
enable-auto-props = yes

### Section for configuring automatic properties.
[auto-props]
### The format of the entries is:
###   file-name-pattern = propname[=value][;propname[=value]...]
### The file-name-pattern can contain wildcards (such as '*' and
### '?').  All entries which match (case-insensitively) will be
### applied to the file.  Note that auto-props functionality
### must be enabled, which is typically done by setting the
### 'enable-auto-props' option.
*.c = svn:eol-style=native
*.cpp = svn:eol-style=native
*.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native
*.dsp = svn:eol-style=CRLF
*.dsw = svn:eol-style=CRLF
*.sh = svn:eol-style=native;svn:executable
*.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL;
*.png = svn:mime-type=image/png
*.jpg = svn:mime-type=image/jpeg
Makefile = svn:eol-style=native

鉴于上述配置,当我们将扩展名为 `.c` 的文件置于版本控制之下时,该文件将自动在其上设置 `svn:eol-style` 属性,其值为 `native`

1.8.0>svn st
?       src\panel.c

1.8.0>svn add src\panel.c
A         src\panel.c

1.8.0>svn proplist src\panel.c --verbose
Properties on 'src\panel.c':
  svn:eol-style
    native

不错,但如果我们是仓库管理员,我们必须依赖所有用户手动设置他们的配置4。如果有一种方法可以将仓库(或仓库中的项目)的所需自动属性定义推送到用户5

`svn:auto-props` 属性

…输入新的 svn:auto-props 属性。此新属性的值应与自动属性运行时配置选项的格式相同:任何数量的以换行符分隔的键值对,格式为 FILE_PATTERN = PROPNAME=VALUE[;PROPNAME=VALUE ...])。

我们可能在存储库的根目录上设置了 svn:auto-props 属性,其值与我们之前示例中的运行时配置非常相似。

1.8.0>svn pg svn:auto-props http://svn.example.com/repos --verbose
Properties on 'http://svn.example.com/repos':
  svn:auto-props
    *.c = svn:eol-style=native
    *.cpp = svn:eol-style=native
    *.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native
    *.dsp = svn:eol-style=CRLF
    *.dsw = svn:eol-style=CRLF
    *.sh = svn:eol-style=native;svn:executable
    *.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL;
    *.png = svn:mime-type=image/png
    *.jpg = svn:mime-type=image/jpeg
    Makefile = svn:eol-style=native

svn:auto-props 属性的值定义了对添加到或导入到继承该属性的目录位置的任何路径的自动属性。

示例:从存储库根目录继承的 svn:auto-props

让我们看一个关于新属性如何设置自动属性的非常简单的示例。假设我们的运行时配置中没有定义任何自动属性。

### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
enable-auto-props = no

此外,假设我们的存储库管理员之前在存储库的根目录上设置了 svn:auto-props 属性 6

1.8.0>svn propget svn:auto-props --verbose -R http://svn.example.com/repos
Properties on 'http://svn.example.com/repos':
  svn:auto-props
    *.c = svn:eol-style=native
    *.h = svn:eol-style=native
    *.py = svn:eol-style=native

我们为当前项目签出一个新的工作副本。

1.8.0>svn co http://svn.example.com/repos/calc/trunk calc-trunk-wc
A    calc-trunk-wc\doc
A    calc-trunk-wc\src
A    calc-trunk-wc\doc\INSTALL
A    calc-trunk-wc\FAQ
A    calc-trunk-wc\src\button.c
A    calc-trunk-wc\src\integer.c
A    calc-trunk-wc\src\real.c
A    calc-trunk-wc\src\main.c
A    calc-trunk-wc\Makefile
A    calc-trunk-wc\README
 U   calc-trunk-wc
Checked out revision 480.

完成一些工作后,我们有一个要纳入版本控制的新文件。

1.8.0>svn st calc-trunk-wc
?       calc-trunk-wc\src\bindings.h

1.8.0>svn add calc-trunk-wc\src\bindings.h
A         calc-trunk-wc\src\bindings.h

当我们这样做时,当然,从存储库根目录继承的 svn:auto-props 属性会导致在添加的文件上自动设置 svn_eol-style 属性。

1.8.0>svn pg svn:auto-props -v --show-inherited-props calc-trunk-wc\src\bindings.h
Inherited properties on 'calc-trunk-wc\src\bindings.h',
from 'http://svn.example.com/repos':
  svn:auto-props
    *.c = svn:eol-style=native
    *.h = svn:eol-style=native
    *.py = svn:eol-style=native

1.8.0>svn pl -v calc-trunk-wc\src\bindings.h
Properties on 'calc-trunk-wc\src\bindings.h':
  svn:eol-style
    native

自动属性的层次结构

前面的示例可能是您遇到的最简单的涉及 svn:auto-props 的情况。但是,如果

在这些情况下,以下规则适用。

A) svn:auto-props 覆盖运行时配置的自动属性:svn:auto-props 中定义的给定模式的自动属性将覆盖自动属性运行时配置中相同模式的相同自动属性 7

B) 更近的 svn:auto-props 优先: 如果相同模式的自动属性从多个父级的 svn:auto-props 属性继承,则路径上更近的父级将覆盖更远的父级。

C) 显式 svn:auto-props 优先于继承的属性: 对于给定模式,在路径上显式设置的 svn:auto-props 属性中的自动属性会覆盖从任何父级继承的相同模式的相同自动属性。

D) 如果文件匹配多个模式,则不保证结果: 与自动属性运行时配置选项类似,如果文件匹配多个定义了相同属性值的模式,则无法保证哪个模式的值将被自动应用。例如,如果添加了文件 foo.py 继承了这两个值,

*.py = svn:eol-style=native
*.p* = svn:eol-style=CRLF

则无法保证添加的文件 foo.py 上将设置哪个 eol-style。

E) --no-auto-props 表示不使用自动属性: 与自动属性运行时选项类似,在命令行使用 --no-auto-props 选项时,会忽略 svn:auto-props 属性。

F) 在运行时配置中禁用自动属性不会影响 RDC: 当 enable-auto-props 运行时配置选项设置为 no 时,不会禁用 svn:auto-props

<pre>### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
### Note: Setting this option to 'no' has no effect on the behavior of
### the svn:auto-props property
enable-auto-props = no</pre>
<

应该放在哪里?

请记住,svn:auto-props 是可继承的。因此,通常您只需要在存储库的根目录上设置该属性。如果您的存储库包含多个需要不同配置的项目,则可以将该属性放在每个项目的根文件夹上 8。请记住,在继承属性方面,越少越好 - 如果您设置 svn:auto-props 使得给定存储库路径从多个父级继承相同的值,那么您可能做得比需要做的更多。

备注

  1. 完全披露:这里讨论的存储库“规定”的配置实际上只是对行为良好的 1.8+ 客户端的建议。旧的客户端显然不会理解新的规定。即使对于较新的客户端,用户也可以轻松地修改客户端以忽略服务器端的建议 - 毕竟 Subversion 开源的!鉴于这种现实,如果您需要 100% 保证合规性,仍然建议通过钩子脚本进行服务器端强制执行所需的行为。

  2. svn:mime-type 实际上属于这两个类别——它可以通过运行时配置设置,但如果那里没有定义任何内容,则 Subversion 将尝试通过一组硬编码规则自动设置 mime 类型。

  3. 我承认这里有一个简化——不仅仅只有一个用户配置,它可以在多达 4 个位置定义

    1. 每个用户的运行时配置
    2. 每个用户的注册表值(仅限 Windows)
    3. 每台机器的运行时配置
    4. 系统范围的注册表值(仅限 Windows)

    编号较低的配置优先于编号较高的配置。在本博文的示例中,为了简单起见,我们假设配置 #2 到 #4 为空,并且我们的整个配置仅在 #1 中定义。

  4. Subversion 在其默认配置中不设置任何自动属性

  5. 即存储库指定的配置!

  6. 请注意,svn:auto-props 属性只能在目录上设置。

  7. 标准运行时配置或 --config-dir 选项指向的配置。

  8. 回想一下第一部分,所有用户都必须对您设置 svn:auto-props 的任何目录具有读取权限,否则他们将无法从该路径继承。

关于作者

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