在您的文本文件中,您只需要这样做:
$Revision$
$Author$
当 Subversion 进行结帐时,它会将它们更改为:
$Revision: 1234$
$Author: Quimby$
无需先为您的关键字命名。
svn:keywords
如果您希望 Subversion 扩展关键字,您必须进行设置。您必须将svn:keywords
属性的值作为由空格分隔的裸关键字分隔,并且大小写正确。它必须是$Id$
而不是$ID$
。
换句话说,你的svn:keywords
财产应该设置为:
Revision Author Date Id
并不是
$Revision$ $Author$ $Date$ $Id$
使用关键字的警告
此外,我为其推出此功能的最终用户是否必须编辑他们的 Subversion 配置文件或只担心在他们的 WC 中的文件/目录上设置关键字?
由于svn:keywords
是一个属性,它将在所有工作副本中设置。结帐的任何人都会看到扩展的关键字。
问题是如果有人添加了一个新文件会发生什么,而您也想svn:keywords
设置这些文件。在 Subversion 1.7 及之前的版本中,如果这些属性未设置为文件上的特定值,则必须使用预提交挂钩来使提交失败。
开发人员在几次提交被拒绝后,因为他们没有在文件上设置此属性,可以在其 Subversion 配置的autoprop部分中设置它。这样,当他们添加新文件时,Subversion 会自动添加属性。
在 Subversion 1.8 中,引入了可继承属性。两个主要是svn:autoprop
和svn:global-ignores
。这两个属性可以替换用户配置中的global-ignores和autoprop部分。这是一种您可以对整个存储库执行此操作而无需担心用户配置的方法。
但是,关键字并不是那么有用。它们通常会比光产生更多的痛苦(而且$Log$
, 是彻头彻尾的邪恶)。
关键词能给你什么信息?如果您在工作副本中,您可以通过简单地运行 Subversion 命令来获取关键字所具有的所有信息以及更多信息。
在工作副本之外,关键字通常在编译阶段消失。即使您将关键字嵌入到字符串中,它也只是该文件的那个版本,并且不会告诉您其余的文件版本。一个更好的方法是嵌入一个对您来说整体有意义的版本字符串。例如,整个程序的版本号。如果你使用像 Jenkins 这样的 CI 系统,这很容易做到。事实上,我们在编译代码时嵌入了 Jenkins 项目和内部版本号(以及工作副本的修订版)。
它在脚本中可能更有用,但在那里它很容易欺骗。想象一个 Python 脚本,其中嵌入了该 Python 脚本的修订版。发现了一个错误,有人修改了文件。嵌入的关键字现在具有误导性。假设需要向此脚本添加一个新功能。开发人员查看脚本上的修订号,检查它,添加功能,然后将新版本返回给客户。现在,原来的错误又回到了程序中。
这就是为什么许多版本控制系统已经去掉了关键字,如果确实有关键字,则必须为每个文件一次打开一个。它们可能会导致编译问题(在 SCCS 中尤其如此,其中关键字是一个被%
符号包围的单个字母,这会导致一些意外扩展事件),它们可能会产生误导,并且在现代版本控制系统中,这不是必需的。
在将关键字嵌入所有文件之前,请仔细考虑您的策略。