本文档旨在描述 Subversion 1.4。如果您正在运行更新版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您的 Subversion 版本的书籍版本。

运行时配置区域

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

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

配置区域布局

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

除了用户级配置区域之外,Subversion 还识别系统范围配置区域的存在。这使系统管理员能够为给定机器上的所有用户建立默认值。请注意,系统范围配置区域本身并不能决定强制性策略——用户级配置区域中的设置会覆盖系统范围配置区域中的设置,而提供给 svn 程序的命令行参数对行为有最终决定权。在类 Unix 平台上,系统范围配置区域应为 /etc/subversion 目录;在 Windows 机器上,它将在公共 Application Data 位置中查找 Subversion 目录(同样,如 Windows 注册表所指定)。与用户级情况不同,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 下。

基于注册表的配置选项在解析 之前 解析其基于文件的对应项,因此会被配置文件中找到的值覆盖。换句话说,Subversion 在 Windows 系统上的以下位置查找配置信息;编号较低的 location 优先于编号较高的 location

  1. 命令行选项

  2. 用户级 INI 文件

  3. 用户级注册表值

  4. 系统范围的 INI 文件

  5. 系统范围的注册表值

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

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

示例 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-passwords"="yes"
"#store-auth-creds"="yes"

[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\tunnels]

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

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


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

配置选项

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

服务器

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

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

[beanie-babies]
…

[collabnet]
…

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

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

http-proxy-exceptions

这指定了一个逗号分隔的模式列表,用于表示应直接访问的存储库主机名,而不使用代理机器。模式语法与 Unix shell 中用于文件名的语法相同。与任何这些模式匹配的存储库主机名将不会被代理。

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 章,嵌入 Subversion

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 文件包含其余当前可用的 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 部分是所有不属于其他地方的内容的最终归宿。[50] 在此部分中,您可以找到

global-ignores

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

除了 svn status 之外,svn addsvn import 命令在扫描目录时也会忽略与列表匹配的文件。您可以通过明确指定文件名或使用 --no-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 是一个文件模式,它匹配一组文件名,而行的其余部分是属性及其值。对一个文件的多重匹配将导致该文件有多个属性集;但是,不能保证自动属性将按其在配置文件中列出的顺序应用,因此您不能让一个规则“覆盖”另一个规则。您可以在 config 文件中找到多个自动属性用法示例。最后,不要忘记将 enable-auto-props 设置为 yes,在 miscellany 部分中,如果您想启用自动属性。



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

[50] 有人喜欢自助餐吗?