本手册是为描述 Subversion 1.1 而编写的。如果您正在运行更新版本的 Subversion,我们强烈建议您访问 https://svnbooks.subversion.org.cn/ 并查阅适合您 Subversion 版本的书籍版本。
目录
如果您一直按顺序阅读本书的章节,那么到目前为止,您应该已经积累了足够的知识来使用 Subversion 客户端执行最常见的版本控制操作。您了解如何从 Subversion 仓库检出工作副本。您熟悉使用 svn commit 和 svn update 函数提交和接收更改。您可能已经形成了一个条件反射,导致您几乎不假思索地运行 svn status 命令。总而言之,您已准备好在一个典型环境中使用 Subversion。
但 Subversion 的功能集并不止步于“常见版本控制操作”。
本章重点介绍 Subversion 的一些不太常用的功能。在本章中,我们将讨论 Subversion 的属性(或“元数据”)支持,以及如何通过调整其运行时配置区域来修改 Subversion 的默认行为。我们将描述如何使用外部定义来指示 Subversion 从多个仓库提取数据。我们将详细介绍 Subversion 发行版中包含的一些额外的客户端和服务器端工具。
在阅读本章之前,您应该熟悉 Subversion 的基本文件和目录版本控制功能。如果您还没有阅读过这些内容,或者需要复习,我们建议您查看 第 2 章,基本概念 和 第 3 章,导览。一旦您掌握了基础知识并阅读完本章,您将成为 Subversion 的高级用户!
Subversion 提供了许多可选的行为,可以由用户控制。许多选项是用户希望应用于所有 Subversion 操作的类型。因此,Subversion 并没有强迫用户记住指定这些选项的命令行参数,并在他们执行的每个操作中使用它们,而是使用配置
Subversion 的配置区域是选项名称及其值的双层层次结构。通常,这归结为一个包含配置文件(第一层)的特殊目录,这些配置文件只是标准 INI 格式的文本文件(使用“节”提供第二层)。这些文件可以使用您喜欢的文本编辑器(如 Emacs 或 vi)轻松编辑,并包含客户端读取的指令,以确定用户首选的几种可选行为中的哪一种。
第一次执行 svn 命令行客户端时,它会创建一个用户专属的配置区域。在类 Unix 系统上,此区域显示为名为.subversion的目录,位于用户的 home 目录中。在 Win32 系统上,Subversion 创建一个名为Subversion的文件夹,通常位于用户的配置文件目录的Application Data区域内(顺便说一下,通常是一个隐藏目录)。但是,在此平台上,确切位置因系统而异,并由 Windows 注册表决定。[25] 我们将使用其 Unix 名称来引用用户专属的配置区域,即.subversion.
除了用户专属的配置区域之外,Subversion 还识别系统范围的配置区域的存在。这使系统管理员能够为给定机器上的所有用户建立默认值。请注意,系统范围的配置区域并不单独决定强制性策略——用户专属配置区域中的设置会覆盖系统范围的设置,而提供给 svn 程序的命令行参数拥有最终的行为决定权。在类 Unix 平台上,系统范围的配置区域预计将是/etc/subversion目录;在 Windows 机器上,它会查找位于公共Subversion位置(同样,由 Windows 注册表指定)内的Application Data目录。与用户专属情况不同,svn 程序不会尝试创建系统范围的配置区域。
配置区域当前包含三个文件——两个配置文件(config和servers),以及一个README.txt文件,该文件描述了 INI 格式。在创建时,这些文件包含每个受支持的 Subversion 选项的默认值,这些值大多被注释掉,并与关于这些键的值如何影响 Subversion 行为的文本描述分组。要更改某个行为,您只需要将相应的配置文件加载到文本编辑器中,并修改所需选项的值。如果您希望在任何时候将默认配置设置还原,您只需删除(或重命名)您的配置目录,然后运行一些无关紧要的 svn 命令,例如 svn --version。一个包含默认内容的新配置目录将被创建。
用户专属配置区域还包含一个身份验证数据的缓存。该auth目录包含一组子目录,这些子目录包含 Subversion 的各种支持的身份验证方法使用的缓存信息片段。此目录的创建方式使得只有用户本人有权读取其内容。
除了通常的基于 INI 的配置区域之外,在 Windows 平台上运行的 Subversion 客户端也可以使用 Windows 注册表来保存配置数据。选项名称及其值与 INI 文件中的相同。“文件/节”层次结构也得以保留,尽管其寻址方式略有不同——在此模式中,文件和节只是注册表键树中的级别。
Subversion 在HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion键下查找系统范围的配置值。例如,global-ignores选项位于miscellany节的config文件中,将在HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion\Config\Miscellany\global-ignores处找到。用户专属配置值应存储在HKEY_CURRENT_USER\Software\Tigris.org\Subversion.
下。基于注册表的配置选项在解析其基于文件的对应选项之前进行解析,因此会被配置文件中找到的值覆盖。换句话说,在 Windows 系统上,配置优先级按以下顺序授予:
命令行选项
用户专属 INI 文件
用户专属注册表值
系统范围的 INI 文件
系统范围的注册表值
此外,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-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 配置选项。此文件中有两个特殊的节名称——groups和global。该groups节本质上是一个交叉引用表。此节中的键是文件中其他节的名称;它们的值是glob——可能包含通配符的文本标记——这些标记与发送 Subversion 请求的机器的主机名进行比较。
[groups] beanie-babies = *.red-bean.com collabnet = svn.collab.net [beanie-babies] … [collabnet] …
当 Subversion 通过网络使用时,它会尝试将要尝试访问的服务器的名称与groups节下的组名匹配。如果匹配成功,Subversion 就会在servers文件中查找一个名为匹配组名的节。它会从该节中读取实际的网络配置设置。
该global节包含适用于所有未被groups节下的任何 glob 匹配的服务器的设置。此节中可用的选项与groups文件中其他服务器节中有效的选项完全相同(当然,除了特殊的
http-proxy-host
http-proxy-port
http-proxy-username
http-proxy-password
http-timeout0这指定了等待服务器响应的时间量(以秒为单位)。如果您遇到网络连接缓慢导致 Subversion 操作超时的问题,则应增加此选项的值。默认值为
此选项指定 Subversion 是否尝试压缩向支持 DAV 的服务器发出的网络请求。默认值为yes(不过压缩只有在网络层中编译了压缩功能时才会发生)。将此选项设置为no以禁用压缩,例如在调试网络传输时。
这是一个整数掩码,底层 HTTP 库 Neon 使用它来选择要产生的调试输出类型。默认值为0, 这将静默所有调试输出。有关 Subversion 如何使用 Neon 的更多信息,请参见 第 8 章,开发人员信息。
这是一个以分号分隔的路径列表,指向包含证书颁发机构 (CA) 证书的文件,这些证书在 Subversion 客户端通过 HTTPS 访问存储库时被接受。
将此变量设置为yes如果您希望 Subversion 自动信任与 OpenSSL 捆绑在一起的默认 CA 集。
如果主机 (或一组主机) 需要 SSL 客户端证书,您通常会收到提示要求提供证书的路径。通过将此变量设置为相同的路径,Subversion 将能够自动找到您的客户端证书,而无需提示您。磁盘上没有存储证书的标准位置;Subversion 将从您指定的任何路径获取它。
如果您的 SSL 客户端证书文件使用密码加密,Subversion 会在使用证书时提示您输入密码。如果您发现这很烦人 (并且不介意将密码存储在servers文件中),那么您可以将此变量设置为证书的密码。您将不再收到提示。
该config文件包含当前可用的 Subversion 运行时选项的其余部分,这些选项与网络无关。目前只有几个选项正在使用,但它们再次被分组到各个部分中,以期待未来的添加。
该auth部分包含与 Subversion 对存储库进行身份验证和授权相关的设置。它包含
这会指示 Subversion 缓存或不缓存用户在响应服务器身份验证挑战时提供的密码。默认值为yes. 将此选项设置为no以禁用此磁盘上的密码缓存。您可以使用--no-auth-cache命令行参数为 svn 命令的单个实例覆盖此选项 (对于支持此参数的子命令)。有关更多信息,请参见 名为“客户端凭据缓存”的部分。
此设置与store-passwords相同,只是它启用或禁用对 所有 身份验证信息的磁盘缓存:用户名、密码、服务器证书以及任何其他类型的可缓存凭据。
该helpers部分控制 Subversion 使用哪些外部应用程序来完成其任务。此部分中的有效选项为
这指定了 Subversion 将用于在提交操作期间查询用户的日志消息的程序,例如在使用 svn commit 时没有使用--message (-m) 或--file (-F) 选项。此程序也与 svn propedit 命令一起使用 - 一个临时文件将用用户希望编辑的属性的当前值填充,编辑直接在编辑器程序中进行 (参见 名为“属性”的部分)。此选项的默认值为空。如果未设置此选项,Subversion 将回退到检查环境变量SVN_EDITOR, VISUAL和EDITOR(按此顺序) 以获取编辑器命令。
这指定了差异程序的绝对路径,在 Subversion 生成“diff”输出时使用 (例如,在使用 svn diff 命令时)。默认情况下,Subversion 使用内部差异库 - 设置此选项将导致它使用外部程序执行此任务。
这指定了三方差异程序的绝对路径。Subversion 使用此程序将用户所做的更改与从存储库接收到的更改合并。默认情况下,Subversion 使用内部差异库 - 设置此选项将导致它使用外部程序执行此任务。
如果由选项指定的程序接受--diff-programdiff3-cmd命令行参数,则应将此标志设置为true.
该tunnels部分允许您定义新的隧道方案,以与 svnserve 和svn://客户端连接一起使用。有关更多详细信息,请参见 名为“SSH 身份验证和授权”的部分。
该miscellany部分是所有其他内容的归宿。[26] 在此部分中,您可以找到
在运行 svn status 命令时,Subversion 会将未版本化的文件和目录与版本化的文件和目录一起列出,并在其旁边标注一个?字符 (参见 名为“svn status”的部分)。有时,看到无趣的未版本化项目 (例如,程序编译产生的目标文件) 在此显示中可能会很烦人。该global-ignores选项是一个以空格分隔的 glob 列表,描述了 Subversion 不应显示的文件和目录的名称,除非它们是版本化的。默认值为*.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store.
除了 svn status 之外,svn add 和 svn import 命令也会忽略与该列表匹配的文件。您可以使用--no-ignore命令行标志为这些命令的单个实例覆盖此选项。有关更细粒度的忽略项目控制信息,请参见 名为“svn:ignore”的部分。
这会指示 Subversion 在新添加或导入的文件上自动设置属性。默认值为no, 所以将此选项设置为yes以启用自动属性。该auto-props部分指定了哪些属性应该设置在哪些文件上。
此变量设置提交日志消息的默认字符集编码。它是--encoding选项的永久形式 (参见 名为“svn 开关”的部分)。Subversion 存储库以 UTF8 存储日志消息,并假定您的日志消息使用您的操作系统的本地语言环境编写。如果您以任何其他编码编写提交消息,则应指定不同的编码。
通常,您的工作副本文件的时间戳反映了它们上次被任何进程触摸的时间,无论该进程是您自己的编辑器还是某个 svn 子命令。这对于开发软件的人来说通常很方便,因为构建系统通常会将时间戳作为决定哪些文件需要重新编译的方式。
然而,在其他情况下,有时希望工作副本文件的时间戳反映它们上次在存储库中更改的时间。该 svn export 命令始终在它生成的树上放置这些“最后提交时间戳”。通过将此配置变量设置为yes, 该 svn checkout, svn update, svn switch 和 svn revert 命令也会在它们触及的文件上设置最后提交时间戳。
该auto-props部分控制 Subversion 客户端在添加或导入文件时自动设置文件属性的功能。它包含以以下格式表示的任意数量的键值对PATTERN = PROPNAME=PROPVALUE其中PATTERN是一个文件模式,匹配一组文件名,而该行的其余部分是属性及其值。对一个文件的多次匹配将导致对该文件进行多次 propset;但是,不能保证自动属性将按照它们在配置文件中列出的顺序应用,因此您无法让一个规则“覆盖”另一个规则。您可以在config文件中找到自动属性使用的一些示例。最后,别忘了设置enable-auto-props为yes在miscellany部分中,如果您希望启用自动属性。