本手册是为了描述 Subversion 1.2 而编写的。如果您运行的是更新版本的 Subversion,我们强烈建议您访问 https://svnbooks.subversion.org.cn/ 并查阅适合您 Subversion 版本的本书版本。

第 7 章 高级主题

目录

运行时配置区域
配置区域布局
配置和 Windows 注册表
配置选项
服务器
配置
属性
为什么使用属性?
操作属性
特殊属性
svn:executable
svn:mime-type
svn:ignore
svn:keywords
svn:eol-style
svn:externals
svn:special
svn:needs-lock
自动属性设置
锁定
创建锁
发现锁
打破和窃取锁
锁通信
挂钩修订版和操作修订版
外部定义
供应商分支
通用供应商分支管理程序
svn_load_dirs.pl
本地化
了解语言环境
Subversion 对语言环境的使用
使用外部差异工具
外部 diff
外部 diff3
Subversion 仓库 URL

如果您一直在按顺序阅读本书的章节,那么到目前为止,您应该已经积累了足够的知识来使用 Subversion 客户端执行最常见的版本控制操作。您了解如何从 Subversion 仓库签出一个工作副本。您熟悉使用 svn commitsvn update 功能提交和接收更改。您可能已经形成了下意识地运行 svn status 命令的习惯。从所有意图和目的来看,您已准备好在一个典型的环境中使用 Subversion。

但 Subversion 的功能集并不止于“常见的版本控制操作”。

本章重点介绍了一些不太常用的 Subversion 功能。在本章中,我们将讨论 Subversion 的属性(或“元数据”)支持,以及如何通过调整其运行时配置区域来修改 Subversion 的默认行为。我们将描述如何使用外部定义来指示 Subversion 从多个仓库提取数据。我们将详细介绍 Subversion 发行版中包含的一些其他客户端和服务器端工具。

在阅读本章之前,您应该熟悉 Subversion 的基本文件和目录版本控制功能。如果您还没有阅读过这些内容,或者需要复习,我们建议您查看 第 2 章,基本概念第 3 章,导览。一旦您掌握了基础知识并阅读了本章,您将成为 Subversion 的高级用户!

运行时配置区域

Subversion 提供了许多用户可以控制的可选行为。这些选项中的许多都是用户希望应用于所有 Subversion 操作的类型。因此,Subversion 并没有强迫用户记住用于指定这些选项的命令行参数,并在他们执行的每次操作中使用它们,而是使用配置文件,并将它们分成一个 Subversion 配置区域。

Subversion 配置区域是选项名称及其值的双层层次结构。通常,这归结为一个包含 配置文件(第一层)的特殊目录,这些配置文件只是标准 INI 格式的文本文件(使用“”提供第二层)。这些文件可以使用您喜欢的任何文本编辑器(例如 Emacs 或 vi)轻松编辑,并包含客户端读取的指令,以确定用户首选的几种可选行为中的哪一个。

配置区域布局

第一次执行 svn 命令行客户端时,它会创建一个特定于用户的配置区域。在类 Unix 系统上,此区域显示为用户主目录中名为 .subversion 的目录。在 Win32 系统上,Subversion 会创建一个名为 Subversion 的文件夹,通常位于用户配置文件目录的 Application Data 区域内(顺便说一下,通常是隐藏目录)。但是,在此平台上,确切的位置因系统而异,并且由 Windows 注册表决定。[29] 我们将使用其 Unix 名称 .subversion 来引用特定于用户的配置区域。

除了特定于用户的配置区域之外,Subversion 还识别系统范围配置区域的存在。这使系统管理员能够为给定机器上的所有用户建立默认值。请注意,系统范围配置区域本身并不规定强制性策略——特定于用户的配置区域中的设置会覆盖系统范围配置区域中的设置,并且提供给 svn 程序的命令行参数对行为具有最终决定权。在类 Unix 平台上,系统范围配置区域预计是 /etc/subversion 目录;在 Windows 机器上,它会在通用 Application Data 位置(同样,如 Windows 注册表所指定)中查找 Subversion 目录。与特定于用户的配置区域不同,svn 程序不会尝试创建系统范围配置区域。

配置区域目前包含三个文件——两个配置文件(configservers),以及一个 README.txt 文件,该文件描述了 INI 格式。在创建时,这些文件包含每个受支持的 Subversion 选项的默认值,大多数情况下被注释掉,并与有关密钥值如何影响 Subversion 行为的文本描述分组在一起。要更改某个特定行为,您只需将相应的配置文件加载到文本编辑器中,并修改所需选项的值即可。如果您希望在任何时候恢复默认配置设置,您只需删除(或重命名)您的配置目录,然后运行一些无关紧要的 svn 命令,例如 svn --version。将创建一个包含默认内容的新配置目录。

特定于用户的配置区域还包含认证数据的缓存。auth 目录包含一组子目录,这些子目录包含 Subversion 的各种支持的认证方法使用的缓存信息片段。此目录的创建方式使得只有用户自己有权读取其内容。

配置和 Windows 注册表

除了通常的基于 INI 的配置区域之外,在 Windows 平台上运行的 Subversion 客户端也可以使用 Windows 注册表来保存配置数据。选项名称及其值与 INI 文件中的相同。“文件/节” 层次结构也得以保留,尽管在处理方式上略有不同——在此模式下,文件和节只是注册表键树中的级别。

Subversion 在 HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion 键下查找系统范围配置值。例如,global-ignores 选项位于 config 文件的 miscellany 节中,可以在 HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion\Config\Miscellany\global-ignores 中找到。特定于用户的配置值应存储在 HKEY_CURRENT_USER\Software\Tigris.org\Subversion 下。

基于注册表的配置选项是在其基于文件的对应项 之前 解析的,因此会被配置文件中找到的值覆盖。换句话说,在 Windows 系统上,配置优先级按以下顺序授予

  1. 命令行选项

  2. 特定于用户的 INI 文件

  3. 特定于用户的注册表值

  4. 系统范围的 INI 文件

  5. 系统范围的注册表值

此外,Windows 注册表实际上不支持“注释掉”的概念。但是,Subversion 会忽略名称以哈希 (#) 字符开头的任何选项键。这允许您有效地注释掉 Subversion 选项而不从注册表中删除整个键,这显然简化了恢复该选项的过程。

svn 命令行客户端从不尝试写入 Windows 注册表,也不会尝试在那里创建默认配置区域。您可以使用 REGEDIT 程序创建所需的键。或者,您可以创建一个 .reg 文件,然后在资源管理器外壳中双击该文件,这将导致数据合并到您的注册表中。

示例 7.1 样例注册表条目 (.reg) 文件。

REGEDIT4

[HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion\Servers\groups]

[HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion\Servers\global]
"#http-proxy-host"=""
"#http-proxy-port"=""
"#http-proxy-username"=""
"#http-proxy-password"=""
"#http-proxy-exceptions"=""
"#http-timeout"="0"
"#http-compression"="yes"
"#neon-debug-mask"=""
"#ssl-authority-files"=""
"#ssl-trust-default-ca"=""
"#ssl-client-cert-file"=""
"#ssl-client-cert-password"=""

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\auth]
"#store-auth-creds"="no"

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\helpers]
"#editor-cmd"="notepad"
"#diff-cmd"=""
"#diff3-cmd"=""
"#diff3-has-program-arg"=""

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"#global-ignores"="*.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store"
"#log-encoding"=""
"#use-commit-times"=""
"#template-root"=""
"#enable-auto-props"=""

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\tunnels]

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\auto-props]

前面的示例显示了 .reg 文件的内容,其中包含一些最常用的配置选项及其默认值。请注意,系统范围(用于网络代理相关选项)和特定于用户的设置(编辑器程序和密码存储等)都存在。另请注意,所有选项实际上都被注释掉了。您只需要从选项名称的开头删除哈希 (#) 字符,并根据需要设置值即可。

配置选项

在本节中,我们将讨论 Subversion 目前支持的特定运行时配置选项。

服务器

servers 文件包含与网络层相关的 Subversion 配置选项。此文件中有两个特殊的节名称——groupsglobalgroups 节本质上是一个交叉引用表。此节中的键是文件中其他节的名称;它们的值是 通配符——可能包含通配符的文本标记——与发送 Subversion 请求的机器的主机名进行比较。

[groups]
beanie-babies = *.red-bean.com
collabnet = svn.collab.net

[beanie-babies]
…

[collabnet]
…

当 Subversion 通过网络使用时,它会尝试将要尝试到达的服务器的名称与 groups 节下的组名进行匹配。如果匹配成功,Subversion 随后会在 servers 文件中查找名称与匹配的组名相同的节。它从该节中读取实际的网络配置设置。

global 节包含用于所有未与 groups 节下的通配符之一匹配的服务器的设置。此节中可用的选项与文件中其他服务器节中有效的选项完全相同(当然,除了特殊的 groups 节之外),并且如下所示

http-proxy-host

这指定了必须通过它传递基于 HTTP 的 Subversion 请求的代理计算机的主机名。它默认为空值,这意味着 Subversion 不会尝试通过代理计算机路由 HTTP 请求,而是会尝试直接联系目标机器。

http-proxy-port

指定代理主机上要使用的端口号。默认值为空。

http-proxy-username

指定提供给代理机的用户名。默认值为空。

http-proxy-password

指定提供给代理机的密码。默认值为空。

http-timeout

指定等待服务器响应的时间(以秒为单位)。如果您遇到因网络连接缓慢导致 Subversion 操作超时的故障,则应增加此选项的值。默认值为 0,这指示底层 HTTP 库 Neon 使用其默认超时设置。

http-compression

指定 Subversion 是否应尝试压缩发送到支持 DAV 的服务器的网络请求。默认值为 yes(尽管只有当该功能已编译到网络层时才会发生压缩)。将其设置为 no 以禁用压缩,例如在调试网络传输时。

neon-debug-mask

这是一个整数掩码,底层 HTTP 库 Neon 使用它来选择要产生的调试输出类型。默认值为 0,这将使所有调试输出静音。有关 Subversion 如何使用 Neon 的更多信息,请参见 第 8 章,开发者信息

ssl-authority-files

这是一个用分号分隔的路径列表,这些路径指向包含 Subversion 客户端通过 HTTPS 访问存储库时接受的证书颁发机构(或 CA)证书的文件。

ssl-trust-default-ca

如果您希望 Subversion 自动信任与 OpenSSL 一起提供的默认 CA 集,请将此变量设置为 yes

ssl-client-cert-file

如果主机(或一组主机)需要 SSL 客户端证书,通常会提示您提供证书的路径。通过将此变量设置为相同的路径,Subversion 将能够自动找到您的客户端证书,而无需提示您。磁盘上没有存储证书的标准位置;Subversion 将从您指定的任何路径获取它。

ssl-client-cert-password

如果您的 SSL 客户端证书文件使用密码加密,则每次使用证书时,Subversion 都会提示您输入密码。如果您觉得这很烦人(并且不介意将密码存储在 servers 文件中),那么您可以将此变量设置为证书的密码。您将不再被提示。

Config

config 文件包含其余当前可用的 Subversion 运行时选项,这些选项与网络无关。目前只有几个选项在使用,但它们仍然按组划分为各个部分,以预期将来的添加。

auth 部分包含与 Subversion 相对于存储库的认证和授权相关的设置。它包含

store-passwords

这指示 Subversion 缓存或不缓存用户在响应服务器认证挑战时提供的密码。默认值为 yes。将其设置为 no 以禁用此磁盘上的密码缓存。您可以使用 --no-auth-cache 命令行参数(对于支持它的那些子命令)来覆盖 svn 命令的单个实例的此选项。有关更多信息,请参见 名为“客户端凭据缓存”的部分

store-auth-creds

此设置与 store-passwords 相同,只是它启用或禁用 所有 认证信息的磁盘缓存:用户名、密码、服务器证书以及任何其他类型的可缓存凭据。

helpers 部分控制 Subversion 使用哪些外部应用程序来完成其任务。此部分中的有效选项是

editor-cmd

这指定 Subversion 将使用的程序,该程序用于在提交操作期间(例如,在不使用 --message (-m) 或 --file (-F) 选项的情况下使用 svn commit 时)查询用户以获取日志消息。该程序也与 svn propedit 命令一起使用——一个临时文件将填充用户希望编辑的属性的当前值,并且编辑直接在编辑器程序中进行(请参见 名为“属性”的部分)。此选项的默认值为空。确定编辑器命令的优先级顺序为

  1. 命令行选项 --editor-cmd

  2. 环境变量 SVN_EDITOR

  3. 配置选项 editor-cmd

  4. 环境变量 VISUAL

  5. 环境变量 EDITOR

  6. 可能,内置于 Subversion 的默认值(在官方版本中不存在)

这些选项或变量中的任何一个的值(与 diff-cmd 不同)是 shell 要执行的命令行的开头。Subversion 将一个空格和要编辑的临时文件的路径附加到该命令行。编辑器应修改临时文件并返回零退出代码以指示成功。

diff-cmd

这指定了差异程序的绝对路径,当 Subversion 生成“diff”输出(例如,当使用 svn diff 命令时)时使用。默认情况下,Subversion 使用内部差异库——设置此选项将导致它使用外部程序执行此任务。有关使用此类程序的更多详细信息,请参见 名为“使用外部差异工具”的部分

diff3-cmd

这指定了三方差异程序的绝对路径。Subversion 使用此程序将用户所做的更改与从存储库接收到的更改合并。默认情况下,Subversion 使用内部差异库——设置此选项将导致它使用外部程序执行此任务。有关使用此类程序的更多详细信息,请参见 名为“使用外部差异工具”的部分

diff3-has-program-arg

如果 diff3-cmd 选项指定的程序接受 --diff-program 命令行参数,则应将此标志设置为 true

tunnels 部分允许您定义要与 svnservesvn:// 客户端连接一起使用的新的隧道方案。有关更多详细信息,请参见 名为“SSH 认证和授权”的部分

miscellany 部分是所有不属于其他地方的东西最终都归属的地方。[30] 在此部分中,您可以找到

global-ignores

在运行 svn status 命令时,Subversion 会将未版本化的文件和目录与版本化的文件和目录一起列出,并使用 ? 字符对它们进行注释(请参见 名为“svn status”的部分)。有时,看到无趣的未版本化项目(例如,程序编译产生的目标文件)在这个显示中会很烦人。 global-ignores 选项是一个用空格分隔的 glob 列表,这些 glob 描述了 Subversion 不应显示的文件和目录的名称,除非它们是版本化的。默认值为 *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store

除了 svn status 之外,svn addsvn import 命令在扫描目录时也会忽略与该列表匹配的文件。您可以通过显式指定文件名或使用 --no-ignore 命令行标志来覆盖这些命令的单个实例的此行为。

有关更细粒度地控制忽略的项目的更多信息,请参见 名为“svn:ignore”的部分

enable-auto-props

这指示 Subversion 在添加或导入新文件时自动设置其属性。默认值为 no,因此将其设置为 yes 以启用自动属性。此文件的 auto-props 部分指定了要在哪些文件上设置哪些属性。

log-encoding

此变量设置提交日志消息的默认字符集编码。它是 --encoding 选项的永久形式(请参见 名为“svn 开关”的部分)。Subversion 存储库以 UTF-8 存储日志消息,并假设您的日志消息使用您操作系统的本机语言环境编写。如果您以任何其他编码编写提交消息,则应指定其他编码。

use-commit-times

通常,您的工作副本文件的时间戳反映了它们上次被任何进程触碰的时间,无论是您自己的编辑器还是某些 svn 子命令。对于开发软件的人来说,这通常很方便,因为构建系统通常会查看时间戳作为确定哪些文件需要重新编译的方式。

但是,在其他情况下,有时让工作副本文件的时间戳反映它们上次在存储库中更改的时间会很不错。 svn export 命令始终将这些“最后提交时间戳”放在它生成的树上。通过将此配置变量设置为 yessvn checkoutsvn updatesvn switchsvn revert 命令也将设置它们触碰的文件的最后提交时间戳。

auto-props 部分控制 Subversion 客户端在添加或导入文件时自动设置其属性的功能。它包含任意数量的键值对,格式为 PATTERN = PROPNAME=PROPVALUE,其中 PATTERN 是与一组文件名匹配的文件模式,该行的其余部分是属性及其值。对文件的多重匹配将导致对该文件的多个 propset;但是,不能保证自动属性将按它们在配置文件中列出的顺序应用,因此您无法让一个规则“覆盖”另一个规则。您可以在 config 文件中找到自动属性使用的一些示例。最后,请不要忘记将 enable-auto-props 设置为 yes,以便在 miscellany 部分启用自动属性。



[29] APPDATA 环境变量指向 Application Data 区域,因此您可以始终将此文件夹称为 %APPDATA%\Subversion

[30] 有人要参加自助餐吗?

TortoiseSVN 官方中文版 1.14.7 发布