本手册旨在描述 Apache™ Subversion® 的 1.7.x 系列。如果您运行的是其他版本的 Subversion,强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的手册。
Subversion 能够将 关键字(版本控制文件中包含的有用动态信息)替换到文件内容中。关键字通常提供有关文件最后修改的信息。由于此信息在每次文件更改时都会发生变化,更重要的是,仅在文件更改 之后 才会发生变化,因此除了版本控制系统之外,任何进程都难以保持数据的完全最新。如果由人工作者处理,这些信息必然会过时。
例如,假设您有一个文档,您希望在其中显示上次修改的日期。您可以要求每个文档作者在提交更改之前,也调整描述上次更改时间的文档部分。但迟早会有人忘记这样做。相反,只需要求 Subversion 对 LastChangedDate
关键字执行关键字替换即可。您可以通过在文件中的所需位置放置 关键字锚点 来控制关键字插入的位置。此锚点只是一个格式为 $
KeywordName
$
的文本字符串。
所有关键字在文件中作为锚点出现时都区分大小写:您必须使用正确的关键字大小写才能进行扩展。您应该将 svn:keywords
属性的值也视为区分大小写——某些关键字名称无论大小写如何都会被识别,但此行为已过时。
Subversion 定义了可用于替换的关键字列表。该列表包含以下关键字,其中一些具有您也可以使用的别名
日期
此关键字描述文件在存储库中最后一次已知更改的时间,格式为 $Date: 2006-07-22 21:42:37 -0700 (Sat, 22 Jul 2006) $
。它也可以指定为 LastChangedDate
。与使用 UTC 的 Id
关键字不同,Date
关键字使用本地时区显示日期。
版本
此关键字描述文件在存储库中最后一次已知更改的版本,看起来像 $Revision: 144 $
。它也可以指定为 LastChangedRevision
或 Rev
。
作者
此关键字描述最后一次已知更改此文件的用户,看起来像 $Author: harry $
。它也可以指定为 LastChangedBy
。
HeadURL
此关键字描述存储库中文件最新版本的完整 URL,看起来像 $HeadURL: http://svn.example.com/repos/trunk/calc.c $
。它可以缩写为 URL
。
Id
此关键字是其他关键字的压缩组合。它的替换看起来像 $Id: calc.c 148 2006-07-28 21:30:43Z sally $
,解释为文件 calc.c
最后一次更改是在 2006 年 7 月 28 日晚上,由用户 sally
在版本 148 中更改的。此关键字显示的日期为 UTC,与 Date
关键字(使用本地时区)不同。
标题
此关键字类似于 Id
关键字,但包含项目最新版本的完整 URL,与 HeadURL
相同。它的替换看起来像 $Header: http://svn.example.com/repos/trunk/calc.c 148 2006-07-28 21:30:43Z sally $
。
前面几个描述使用了 “最后已知” 或类似的措辞。请记住,关键字扩展是客户端操作,您的客户端 “知道” 的只是您更新工作副本以包含这些更改时存储库中发生的更改。如果您从未更新工作副本,即使这些版本控制的文件在存储库中定期更改,您的关键字也不会扩展到不同的值。
仅仅在你的文件中添加关键字锚文本并不会产生任何特殊效果。除非明确要求,Subversion 永远不会尝试对你的文件内容进行文本替换。毕竟,你可能正在编写一篇关于如何使用关键字的文档[19],你肯定不希望 Subversion 替换你精心编写的未替换关键字锚文本!
为了告诉 Subversion 是否要对特定文件进行关键字替换,我们再次使用与属性相关的子命令。当在版本控制的文件上设置 svn:keywords
属性时,它会控制哪些关键字将在该文件上被替换。该属性的值是一个以空格分隔的关键字名称或别名列表。
例如,假设你有一个名为 weather.txt
的版本控制文件,内容如下
Here is the latest report from the front lines. $LastChangedDate$ $Rev$ Cumulus clouds are appearing more frequently as summer approaches.
如果在该文件上没有设置 svn:keywords
属性,Subversion 不会做任何特殊操作。现在,让我们启用对 LastChangedDate
关键字的替换。
$ svn propset svn:keywords "Date Author" weather.txt property 'svn:keywords' set on 'weather.txt' $
现在,你对 weather.txt
文件进行了本地属性修改。你不会看到文件内容有任何变化(除非你在设置属性之前自己进行了一些修改)。请注意,该文件包含 Rev
关键字的关键字锚文本,但我们没有将该关键字包含在我们设置的属性值中。Subversion 会愉快地忽略对文件中不存在的关键字的替换请求,并且不会替换 svn:keywords
属性值中不存在的关键字。
在你提交此属性更改后,Subversion 会立即使用新的替换文本更新你的工作文件。你将不再看到你的关键字锚文本 $LastChangedDate$
,而是看到它的替换结果。该结果还包含关键字的名称,并继续用美元符号 ($
) 字符分隔。正如我们预测的那样,Rev
关键字没有被替换,因为我们没有要求它被替换。
还要注意,我们将 svn:keywords
属性设置为 Date Author
,但关键字锚文本使用了别名 $LastChangedDate$
,并且仍然正确扩展。
Here is the latest report from the front lines. $LastChangedDate: 2006-07-22 21:42:37 -0700 (Sat, 22 Jul 2006) $ $Rev$ Cumulus clouds are appearing more frequently as summer approaches.
如果其他人现在提交了对 weather.txt
的更改,你对该文件的副本将继续显示与之前相同的替换关键字值,直到你更新你的工作副本。此时,你 weather.txt
文件中的关键字将被重新替换为反映该文件最新已知提交的信息。
你也可以指示 Subversion 为替换的关键字维护一个固定长度(以字节数表示)。通过在关键字名称后使用双冒号 (::
),然后是一些空格字符,你可以定义这个固定宽度。当 Subversion 准备用关键字及其值替换你的关键字时,它实际上只替换这些空格字符,保持关键字字段的总宽度不变。如果替换的值比定义的字段宽度短,则替换字段的末尾将有额外的填充字符(空格);如果它太长,则在最后的美元符号终止符之前用一个特殊的哈希 (#
) 字符截断。
例如,假设你有一个文档,其中有一部分表格数据反映了文档的 Subversion 关键字。使用原始的 Subversion 关键字替换语法,你的文件可能看起来像这样
$Rev$: Revision of last commit $Author$: Author of last commit $Date$: Date of last commit
现在,这在开始的时候看起来很漂亮,而且是表格形式的。但是,当你提交该文件时(当然是在启用关键字替换的情况下),你会看到
$Rev: 12 $: Revision of last commit $Author: harry $: Author of last commit $Date: 2006-03-15 02:33:03 -0500 (Wed, 15 Mar 2006) $: Date of last commit
结果并不那么美观。你可能会想在替换后调整文件,使其再次看起来像表格。但这只在关键字值宽度相同的情况下才有效。如果最后一次提交的修订版本进入了一个新的位值(例如,从 99 到 100),或者另一个用户名更长的用户提交了该文件,那么一切都将再次变得混乱。但是,如果你使用的是 Subversion 1.2 或更高版本,你可以使用新的固定长度关键字语法,并定义一些看起来合理的字段宽度,因此你的文件可能看起来像这样
$Rev:: $: Revision of last commit $Author:: $: Author of last commit $Date:: $: Date of last commit
您将此更改提交到您的文件。这次,Subversion 注意到新的固定长度关键字语法,并根据您在双冒号和尾部美元符号之间放置的填充来维护字段的宽度。替换后,字段的宽度完全保持不变——Rev
和 Author
的短值用空格填充,而长的 Date
字段则被哈希字符截断。
$Rev:: 13 $: Revision of last commit $Author:: harry $: Author of last commit $Date:: 2006-03-15 0#$: Date of last commit
使用固定长度关键字在执行替换到本身使用固定长度字段存储数据的复杂文件格式时特别有用,或者对于给定数据字段的存储大小难以从格式的本机应用程序外部修改的情况。当然,在涉及二进制文件格式时,您必须始终非常小心地确保您引入的任何关键字替换(固定长度或其他)不会破坏该格式的完整性。虽然这听起来可能很简单,但对于当今使用的大多数流行二进制文件格式来说,这可能是一项令人惊讶的困难任务,而且 不 是胆小者可以尝试的事情!
警告 | |
---|---|
请注意,由于关键字字段的宽度以字节为单位测量,因此存在破坏多字节值的可能性。例如,包含一些多字节 UTF-8 字符的用户名可能会在构成这些字符之一的字节字符串的中间被截断。结果在字节级别上将仅仅是截断,但在作为 UTF-8 文本查看时,很可能显示为字符串,其中最后一个字符不正确或乱码。可以想象,某些应用程序在被要求加载文件时,会注意到损坏的 UTF-8 文本,并认为整个文件已损坏,从而拒绝完全操作该文件。因此,在将关键字限制为固定大小的情况下,请选择一个允许这种字节级扩展的大小。 |