本手册旨在描述 Apache™ Subversion® 的 1.7.x 系列。如果您运行的是其他版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的文档。
Subversion 提供了许多用户可以控制的可选行为。许多选项都是用户希望应用于所有 Subversion 操作的类型。因此,Subversion 并没有强迫用户记住用于指定这些选项的命令行参数,并在执行的每个操作中使用它们,而是使用配置文件,并将它们分隔到一个 Subversion 配置区域中。
Subversion 配置区域 是一个两级层次结构,包含选项名称及其值。通常,这归结为一个包含 配置文件(第一级)的特殊目录,这些配置文件只是标准 INI 格式的文本文件,其中 “节” 提供第二级。您可以使用您喜欢的文本编辑器(例如 Emacs 或 vi)轻松编辑这些文件,它们包含客户端读取的指令,以确定用户首选的几种可选行为中的哪一种。
第一次执行 svn 命令行客户端时,它会创建一个用户级配置区域。在类 Unix 系统上,此区域显示为用户主目录中的名为 .subversion
的目录。在 Win32 系统上,Subversion 会创建一个名为 Subversion
的文件夹,通常位于用户配置文件目录的 Application Data
区域(顺便说一下,通常是一个隐藏目录)。但是,在此平台上,确切位置因系统而异,并由 Windows 注册表决定。[64] 我们将使用其 Unix 名称 .subversion
来引用用户级配置区域。
除了每个用户的配置区域之外,Subversion 还识别系统范围的配置区域。这使系统管理员能够为给定机器上的所有用户建立默认值。请注意,系统范围的配置区域本身并不规定强制策略——每个用户的配置区域中的设置会覆盖系统范围的设置,而提供给 svn 程序的命令行参数对行为具有最终决定权。在类 Unix 平台上,系统范围的配置区域预计是 /etc/subversion
目录;在 Windows 机器上,它会在常见的 Application Data
位置(同样,由 Windows 注册表指定)中查找 Subversion
目录。与每个用户的情况不同,svn 程序不会尝试创建系统范围的配置区域。
每个用户的配置区域目前包含三个文件——两个配置文件 (config
和 servers
),以及一个 README.txt
文件,它描述了 INI 格式。在创建时,这些文件包含对每个支持的 Subversion 选项的默认值,大部分被注释掉,并与关于键值如何影响 Subversion 行为的文本描述分组在一起。要更改特定行为,您只需将相应的配置文件加载到文本编辑器中,并修改所需选项的值。如果您希望在任何时候恢复默认配置设置,您只需删除(或重命名)您的配置目录,然后运行一些无害的 svn 命令,例如 svn --version
。将创建一个包含默认内容的新配置目录。
Subversion 还允许您通过 --config-option
选项在命令行中覆盖单个配置选项值,如果您需要对行为进行(非常)临时的更改,这将特别有用。有关此选项的正确用法,请参阅 名为“svn 选项”的部分。
每个用户的配置区域还包含一个身份验证数据缓存。 auth
目录包含一组子目录,其中包含 Subversion 支持的各种身份验证方法使用的缓存信息片段。此目录的创建方式使得只有用户本人有权读取其内容。
除了通常的基于 INI 的配置区域之外,在 Windows 平台上运行的 Subversion 客户端也可以使用 Windows 注册表来保存配置数据。选项名称及其值与 INI 文件中的相同。 “file/section” 层次结构也保留,尽管以稍微不同的方式处理——在此模式中,文件和部分只是注册表键树中的级别。
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 系统上查找配置信息的位置如下;编号较低的位置优先于编号较高的位置
命令行选项
每个用户的 INI 文件
每个用户的注册表值
系统范围的 INI 文件
系统范围的注册表值
此外,Windows 注册表并不真正支持 “注释掉” 的概念。但是,Subversion 会忽略任何名称以哈希 (#
) 字符开头的选项键。这允许您有效地注释掉 Subversion 选项,而无需从注册表中删除整个键,这显然简化了恢复该选项的过程。
svn 命令行客户端从不尝试写入 Windows 注册表,也不会尝试在其中创建默认配置区域。您可以使用 REGEDIT 程序创建所需的键。或者,您可以创建一个 .reg
文件(例如 示例 7.1,“示例注册表项 (.reg) 文件” 中的文件),然后双击资源管理器中的该文件图标,这将导致数据合并到您的注册表中。
示例 7.1. 示例注册表项 (.reg) 文件
REGEDIT4 [HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion\Servers\groups] [HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion\Servers\global] "#http-auth-types"="basic;digest;negotiate" "#http-compression"="yes" "#http-library"="" "#http-proxy-exceptions"="" "#http-proxy-host"="" "#http-proxy-password"="" "#http-proxy-port"="" "#http-proxy-username"="" "#http-timeout"="0" "#neon-debug-mask"="" "#ssl-authority-files"="" "#ssl-client-cert-file"="" "#ssl-client-cert-password"="" "#ssl-pkcs11-provider"="" "#ssl-trust-default-ca"="" "#store-auth-creds"="yes" "#store-passwords"="yes" "#store-plaintext-passwords"="ask" "#store-ssl-client-cert-pp"="yes" "#store-ssl-client-cert-pp-plaintext"="ask" "#username"="" [HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\auth] "#password-stores"="windows-cryptoapi" [HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\helpers] "#diff-cmd"="" "#diff-extensions"="-u" "#diff3-cmd"="" "#diff3-has-program-arg"="" "#editor-cmd"="notepad" "#merge-tool-cmd"="" [HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\tunnels] [HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany] "#enable-auto-props"="no" "#global-ignores"="*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo *.rej *~ #*# .#* .*.swp .DS_Store" "#interactive-conflicts"="yes" "#log-encoding"="" "#mime-types-file"="" "#no-unlock"="no" "#preserved-conflict-file-exts"="doc ppt xls od?" "#use-commit-times"="no" [HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\auto-props]
示例 7.1,“示例注册表项 (.reg) 文件” 显示了 .reg
文件的内容,其中包含一些最常用的配置选项及其默认值。请注意系统范围(用于网络代理相关选项)和每个用户设置(编辑器程序和密码存储等)的存在。还要注意所有选项实际上都被注释掉了。您只需要从选项名称的开头删除哈希 (#
) 字符,并根据需要设置值。
在本节中,我们将讨论 Subversion 当前支持的特定运行时配置选项。
servers
文件包含与网络层相关的 Subversion 配置选项。此文件中有两个特殊部分——[groups]
和 [global]
。 [groups]
部分本质上是一个交叉引用表。此部分中的键是文件中其他部分的名称;它们的值是 globs——可能包含通配符的文本标记——与发送 Subversion 请求的机器的主机名进行比较。
[groups] beanie-babies = *.red-bean.com collabnet = svn.collab.net [beanie-babies] … [collabnet] …
当 Subversion 通过网络使用时,它会尝试将要访问的服务器的名称与 [groups]
部分下的组名进行匹配。如果匹配成功,Subversion 就会在 servers
文件中查找名称与匹配的组名相同的部分。从该部分中,它读取实际的网络配置设置。
[global]
部分包含适用于所有未与 [groups]
部分下的某个 glob 匹配的服务器的设置。此部分中可用的选项与文件中的其他服务器部分(当然,除了特殊的 [groups]
部分)中有效的选项完全相同,如下所示
http-auth-types
这是一个用分号分隔的 HTTP 身份验证类型列表,客户端将认为这些类型是可以接受的。有效的类型是 basic
、digest
和 negotiate
,默认行为是接受所有这些身份验证类型。例如,一个坚持不以明文形式传输身份验证凭据的客户端可能配置为该选项的值为 digest;negotiate
——从列表中省略 basic
。(请注意,此设置仅由 Subversion 的基于 Neon 的 HTTP 提供程序模块遵守。)
http-compression
这指定了 Subversion 是否应该尝试压缩发送到支持 DAV 的服务器的网络请求。默认值为 yes
(尽管压缩仅在网络层中编译了该功能时才会发生)。将其设置为 no
以禁用压缩,例如在调试网络传输时。
http-library
Subversion 提供了一对存储库访问模块,它们了解其 WebDAV 网络协议。最初的模块(随 Subversion 1.0 一起发布)是 libsvn_ra_neon
(尽管当时它被称为 libsvn_ra_dav
)。较新的 Subversion 版本还提供了 libsvn_ra_serf
,它使用不同的底层实现,旨在支持一些较新的 HTTP 概念。
目前,libsvn_ra_serf
仍然被认为是实验性的,尽管它在常见情况下似乎运行良好。为了鼓励实验,Subversion 提供了 http-library
运行时配置选项,允许用户指定(通常或以每服务器组的方式)他们希望使用的 WebDAV 访问模块——neon
或 serf
。
http-proxy-exceptions
此选项指定一个以逗号分隔的模式列表,用于列出应直接访问的存储库主机名,而不使用代理机器。模式语法与 Unix shell 中用于文件名的语法相同。与任何这些模式匹配的存储库主机名将不会被代理。
http-proxy-host
此选项指定代理计算机的主机名,您的基于 HTTP 的 Subversion 请求必须通过该计算机。默认值为一个空值,这意味着 Subversion 不会尝试通过代理计算机路由 HTTP 请求,而是会尝试直接联系目标机器。
http-proxy-password
此选项指定要提供给代理机器的密码。默认值为一个空值。
http-proxy-port
此选项指定要使用的代理主机上的端口号。默认值为一个空值。
http-proxy-username
此选项指定要提供给代理机器的用户名。默认值为一个空值。
http-timeout
此选项指定等待服务器响应的时间量(以秒为单位)。如果您遇到网络连接缓慢导致 Subversion 操作超时的问题,则应增加此选项的值。默认值为 0
,它指示底层 HTTP 库 Neon 使用其默认超时设置。
neon-debug-mask
这是一个整数掩码,底层 HTTP 库 Neon 使用它来选择要产生的调试输出类型。默认值为 0
,这将使所有调试输出静音。有关 Subversion 如何使用 Neon 的更多信息,请参见 第 8 章,嵌入 Subversion。
ssl-authority-files
这是一个用分号分隔的路径列表,指向包含证书颁发机构 (CA) 证书的文件,这些证书在 Subversion 客户端通过 HTTPS 访问存储库时被接受。
ssl-client-cert-file
如果主机(或一组主机)需要 SSL 客户端证书,您通常会被提示输入证书的路径。通过将此变量设置为相同的路径,Subversion 将能够自动找到您的客户端证书,而无需提示您。磁盘上没有存储证书的标准位置;Subversion 将从您指定的任何路径获取它。
ssl-client-cert-password
如果您的 SSL 客户端证书文件被密码加密,Subversion 将在每次使用证书时提示您输入密码。如果您觉得这很烦人(并且不介意将密码存储在 servers
文件中),您可以将此变量设置为证书的密码。您将不再被提示。
ssl-pkcs11-provider
此选项的值是 PKCS#11 提供程序的名称,SSL 客户端证书将从中提取(如果服务器要求提供)。此设置仅由 Subversion 的基于 Neon 的 HTTP 提供程序模块认可。
ssl-trust-default-ca
如果希望 Subversion 自动信任与 OpenSSL 一起提供的默认 CA 集,请将此变量设置为 yes
。
store-auth-creds
此设置与 store-passwords
相同,只是它启用或禁用 所有 身份验证信息的磁盘缓存:用户名、密码、服务器证书以及任何其他类型的可缓存凭据。
store-passwords
这指示 Subversion 缓存或不缓存用户在响应服务器身份验证挑战时提供的密码。默认值为 yes
。将其设置为 no
以禁用此磁盘密码缓存。您可以使用 --no-auth-cache
命令行参数(对于支持它的子命令)为 svn 命令的单个实例覆盖此选项。有关这方面的更多信息,请参阅 名为“缓存凭据”的部分。请注意,无论此选项如何配置,Subversion 不会以明文形式存储密码,除非 store-plaintext-passwords
选项也设置为 yes
。
store-plaintext-passwords
此变量仅在类 Unix 系统上很重要。它控制 Subversion 客户端在当前身份验证域的密码只能以未加密形式缓存到磁盘上的 ~/.subversion/auth/
缓存区域中的情况下的行为。您可以将其设置为 yes
或 no
以分别启用或禁用以未加密形式缓存密码。默认设置为 ask
,这将导致 Subversion 客户端在每次要将 新 密码添加到 ~/.subversion/auth/
缓存区域时询问您。
store-ssl-client-cert-pp
此选项控制 Subversion 是否缓存用户提供的 SSL 客户端证书密码。其默认值为 yes
。将其设置为 no
以禁用此密码缓存。
store-ssl-client-cert-pp-plaintext
此选项控制 Subversion 在尝试缓存 SSL 客户端证书密码时,是否允许使用其磁盘上的明文存储机制。此选项的默认值为 ask
,这会导致 Subversion 客户端在每次将 新的 客户端证书密码添加到 ~/.subversion/auth/
缓存区域之前询问您。将此选项的值设置为 yes
或 no
以指示您的偏好并避免相关的提示。
该 config
文件包含其余当前可用的 Subversion 运行时选项 - 那些与网络无关的选项。截至撰写本文时,只有少数选项在使用中,但它们再次被分组到各个部分中,以期将来添加更多选项。
该 [auth]
部分包含与 Subversion 对存储库进行身份验证和授权相关的设置。它包含以下内容
password-stores
此逗号分隔列表指定 Subversion 在保存和检索缓存的身份验证凭据时应尝试使用哪些(如果有)系统提供的密码存储,以及 Subversion 应按什么顺序优先使用它们。默认值为 gnome-keyring, kwallet, keychain, windows-crypto-api
,分别代表 GNOME 密钥环、KDE 钱包、Mac OS X 密钥链和 Microsoft Windows 密码 API。系统上不可用的列出的存储将被忽略。
store-passwords
此选项已从 config
文件中弃用。它现在作为服务器配置区域中的每个服务器配置项存在。有关详细信息,请参阅 名为“服务器”的部分。
store-auth-creds
此选项已从 config
文件中弃用。它现在作为服务器配置区域中的每个服务器配置项存在。有关详细信息,请参阅 名为“服务器”的部分。
该 [helpers]
部分控制 Subversion 使用哪些外部应用程序来完成其任务。此部分中的有效选项是
diff-cmd
这指定了差异程序的绝对路径,在 Subversion 生成 “diff” 输出时使用(例如,在使用 svn diff 命令时)。默认情况下,Subversion 使用内部差异库 - 设置此选项将导致它使用外部程序执行此任务。有关使用此类程序的更多详细信息,请参阅 名为“使用外部差异和合并工具”的部分。
diff-extensions
与 --extensions
(-x
) 命令行选项类似,这指定了传递给文件内容差异引擎的附加选项。有意义的扩展选项集因客户端是使用 Subversion 的内部差异引擎还是外部机制而异。有关详细信息,请参阅 svn help diff
的输出。此选项的默认值为 -u
。
diff3-cmd
这指定了三方差异程序的绝对路径。Subversion 使用此程序将用户所做的更改与从存储库接收到的更改合并。默认情况下,Subversion 使用内部差异库 - 设置此选项将导致它使用外部程序执行此任务。有关使用此类程序的更多详细信息,请参阅 名为“使用外部差异和合并工具”的部分。
diff3-has-program-arg
如果由 diff3-cmd
选项指定的程序接受 --diff-program
命令行参数,则应将此标志设置为 true
。
editor-cmd
这指定了 Subversion 将用来查询用户以获取某些类型的文本元数据或在交互式解决冲突时使用的程序。有关使用 Subversion 的外部文本编辑器的更多详细信息,请参阅 名为“使用外部编辑器”的部分。
merge-tool-cmd
这指定了 Subversion 将用来对您的版本控制文件执行三方合并操作的程序。有关使用此类程序的更多详细信息,请参阅 名为“使用外部差异和合并工具”的部分。
[tunnels]
部分允许您定义新的隧道方案,以供 svnserve 和 svn://
客户端连接使用。有关更多详细信息,请参阅 名为“通过 SSH 隧道”的部分。
miscellany
部分是所有不属于其他地方的内容的最终归宿。 [65] 在此部分中,您可以找到
enable-auto-props
这指示 Subversion 自动为新添加或导入的文件设置属性。默认值为 no
,因此将其设置为 yes
以启用此功能。此文件的 [auto-props]
部分指定了要为哪些文件设置哪些属性。
global-ignores
在运行 svn status 命令时,Subversion 会将未版本控制的文件和目录与版本控制的文件和目录一起列出,并使用 ?
字符对其进行注释(请参阅 名为“查看更改概述”的部分)。有时,看到不感兴趣的未版本控制的项目(例如,程序编译产生的目标文件)会很烦人。 global-ignores
选项是空格分隔的 glob 列表,描述了 Subversion 不应显示的文件和目录的名称,除非它们是版本控制的。默认值为 *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo *.rej *~ #*# .#* .*.swp .DS_Store
。
除了 svn status 之外,svn add 和 svn import 命令在扫描目录时也会忽略与列表匹配的文件。您可以通过显式指定文件名或使用 --no-ignore
命令行标志来覆盖这些命令的单个实例的此行为。
有关更细粒度地控制忽略项目的更多信息,请参阅 名为“忽略未版本控制的项目”的部分。
interactive-conflicts
这是一个布尔选项,指定 Subversion 是否应尝试交互式地解决冲突。如果其值为 yes
(这是默认值),Subversion 将提示用户如何处理冲突,方法与 名为“解决任何冲突”的部分 中演示的方法相同。否则,它将简单地标记冲突并继续其操作,将解决推迟到以后的时间。
log-encoding
此变量设置提交日志消息的默认字符集编码。它是 --encoding
选项(参见 名为“svn 选项”的部分)的永久形式。Subversion 存储库以 UTF-8 格式存储日志消息,并假设您的日志消息使用您的操作系统本地语言环境编写。如果您的提交消息使用任何其他编码编写,则应指定不同的编码。
mime-types-file
此选项是 Subversion 1.5 中的新选项,它指定 MIME 类型映射文件的路径,例如 Apache HTTP Server 提供的 mime.types
文件。Subversion 使用此文件将 MIME 类型分配给新添加或导入的文件。有关 Subversion 检测和使用文件内容类型的更多信息,请参见 名为“自动属性设置”的部分 和 名为“文件内容类型”的部分。
no-unlock
此布尔选项对应于 svn commit 的 --no-unlock
选项,它告诉 Subversion 不要释放您刚刚提交的文件的锁。如果此运行时选项设置为 yes
,Subversion 将永远不会自动释放锁,让您显式运行 svn unlock。它默认为 no
。
preserved-conflict-file-exts
此选项的值是 Subversion 在生成冲突文件名时应保留的文件扩展名的空格分隔列表。默认情况下,列表为空。此选项是 Subversion 1.5 中的新选项。
当 Subversion 检测到冲突的文件内容更改时,它会将这些冲突的解决推迟到用户。为了帮助解决问题,Subversion 会在工作副本中保留各种竞争版本文件的原始副本。默认情况下,这些冲突文件具有通过将自定义扩展名(例如 .mine
或 .
(其中 REV
REV
是修订号))附加到原始文件名而构造的名称。这种命名方案的一个小麻烦是,在文件扩展名决定用于打开和编辑该文件的默认应用程序的操作系统上,附加自定义扩展名会阻止该文件被其本机应用程序轻松打开。例如,如果文件 ReleaseNotes.pdf
发生冲突,冲突文件可能被命名为 ReleaseNotes.pdf.mine
或 ReleaseNotes.pdf.r4231
。虽然您的系统可能配置为使用 Adobe 的 Acrobat Reader 打开扩展名为 .pdf
的文件,但您的系统上可能没有配置用于打开扩展名为 .r4231
的所有文件的应用程序。
不过,您可以使用此配置选项来解决此烦人问题。对于具有指定扩展名之一的文件,Subversion 将像以前一样将自定义扩展名附加到冲突文件名,但随后还会重新附加文件的原始扩展名。使用前面的示例,并假设 pdf
是在此列表中配置的扩展名之一,则为 ReleaseNotes.pdf
生成的冲突文件将分别命名为 ReleaseNotes.pdf.mine.pdf
和 ReleaseNotes.pdf.r4231.pdf
。由于每个文件都以 .pdf
结尾,因此将使用正确的默认应用程序来查看它们。
use-commit-times
通常,您的工作副本文件的时间戳反映了它们最后被任何进程(无论是您自己的编辑器还是某些 svn 子命令)触碰的时间。这对于开发软件的人来说通常很方便,因为构建系统通常会查看时间戳作为决定哪些文件需要重新编译的方式。
但是,在其他情况下,有时让工作副本文件的时间戳反映它们最后在存储库中更改的时间会很不错。 svn export 命令始终将这些 “最后提交时间戳” 放置在它生成的树上。通过将此配置变量设置为 yes
,svn checkout、svn update、svn switch 和 svn revert 命令也会在它们触碰的文件上设置最后提交时间戳。
[auto-props]
部分控制 Subversion 客户端在添加或导入文件时自动设置文件属性的能力。它包含任意数量的键值对,格式为
,其中 PATTERN
= PROPNAME
=VALUE
[;PROPNAME
=VALUE
...]PATTERN
是匹配一个或多个文件名的文件模式,该行的其余部分是分号分隔的属性赋值集。(如果您需要在属性的名称或值中使用分号,您可以通过将其加倍来转义它。)
$ cat ~/.subversion/config … [auto-props] *.c = svn:eol-style=native *.html = svn:eol-style=native;svn:mime-type=text/html;; charset=UTF8 *.sh = svn:eol-style=native;svn:executable … $ cd projects/myproject $ svn status ? www/index.html $ svn add www/index.html A www/index.html $ svn diff www/index.html … Property changes on: www/index.html ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/html; charset=UTF8 Added: svn:eol-style ## -0,0 +1 ## +native $
对一个文件的多个匹配将导致该文件有多个 propsets;但是,不能保证自动属性将按它们在配置文件中列出的顺序应用,因此您不能让一个规则 “覆盖” 另一个规则。您可以在 config
文件中找到自动属性使用的几个示例。最后,不要忘记在 miscellany
部分将 enable-auto-props
设置为 yes
,如果您想启用自动属性。