8

有没有办法默认启用 svn:keywords 以便每次添加新的源文件时不需要为每个关键字打开此属性?

4

3 回答 3

11

是的,使用 Subversion 自动属性:http ://www.dcepler.net/post.cfm/subversion-auto-properties

该部分的每个条目[auto-props]都是一个文件 glob,后跟 Subversion 属性,以在添加匹配该 glob 的文件时自动应用。例如,如果您希望所有 CPP 文件默认具有某组属性,则按照http://www.dcepler.net/post.cfm/subversion-auto-properties上的说明并根据以下内容修改以下行您的偏好:

*.cpp = svn:eol-style=native; svn:keywords="作者日期 ID 版本 URL"; svn:mime-type=文本/纯文本

请注意,如果您添加了具有自动属性的文件svn add并随后启用了自动属性,则自动属性将不会应用于添加的文件。自动属性仅应用于启用自动属性后添加的文件。

于 2011-09-08T14:12:19.103 回答
3

如上所述,您可以使用自动属性来执行此操作,但您应该问自己一个大问题:

  • 为什么要使用关键字?

当您进行开发时,您可以轻松地使用各种svn命令来获取将存储在关键字中的任何信息,因此这确实没有必要。

有些人声称,一旦软件在客户站点上,关键字是必需的,但有更好的机制可用于验证您正在使用的软件的修订版本。例如,在编译期间,您可以创建一个具有更有意义的修订 ID(可能是发布号和构建日期)的文件,并将其显示为一种“关于框”。ID 更有意义。

我也知道我不能相信可能在客户站点中的 shell 脚本中包含的关键字。shell 脚本可能会说一个修订号,但 shell 脚本可能已经过编辑。

如果您真的非常需要这个,并且需要在您的站点上强制执行,那么当关键字属性不在文件中时,您将需要一个预提交触发器来失败。只能为客户端设置自动属性。这意味着您必须确保您的每个开发人员都有这一套。每次他们获得新计算机时,您都必须再次验证。

也不保证该属性在文件中。存储库中的旧文件即使被编辑也不会神奇地添加。(仅当文件添加到存储库时才添加自动属性)。也没有什么可以阻止开发人员将其删除。或者,在他们的设置中编辑他们的自动属性。

您必须使用预提交触发器来保证 svn:keywords 属性在每个需要它的文件上并且设置正确。预提交挂钩将简单地拒绝提交未设置此属性的事务。开发商将被迫添加该物业。经过一番抱怨后,开发人员将设置他们的 Subversion 客户端以使用自动属性并自行维护。

我只是碰巧有一个可以强制执行此操作的预提交触发器。触发器是用 Perl 编写的,但只需要标准模块,因此很容易设置。您可以将其配置为说明哪些文件需要关键字以及应该设置什么。如果一个文件正在被提交并且它没有将 svn:keywords 属性设置为正确的值,那么提交将会失败,并且错误消息将解释提交失败的原因以及开发人员需要做什么。

于 2011-09-08T15:22:43.690 回答
1

在我们的 PL/SQL 程序(和 SQL 脚本)中存储 SVN 关键字为开发过程和系统完整性增加了重要价值。将更改发送到生产环境时,会通过 Revision 关键字对其进行跟踪和管理。在实施此之前,移动文件和确保部署正确文件的过程非常容易出错。此外,我们可以向数据库查询版本数据(参见下面的 SQL)。

  --
  ---------  Begin Version Control Data----------------------------------------
  -- $LastChangedDate: 2014-06-27 13:45:09 -0500 (Fri, 27 Jun 2014) $
  -- $Revision: 1750 $
  -- $LastChangedBy: kilarvk $
  -- $URL: svn://jdcsubv01/SQL/JDC/Trunk/JDC_UTIL.pks $
  ---------  End Version Control Data -----------------------------------------
  -- 

--select SVN Keyword Info
SELECT OWNER,
       NAME,
       TYPE,
       SUBSTR(TEXT,INSTR(TEXT,'$')-1) AS KEYWORD
FROM ALL_SOURCE 
WHERE OWNER = UPPER(NVL('&owner',OWNER))
   AND NAME = UPPER(NVL('&&pgm_name',NAME))
   AND (text LIKE '%$Revision%'
     OR TEXT LIKE '%$URL%'
     OR TEXT LIKE '%$Id%'
     OR TEXT LIKE '%$LastChanged%')

例子:

JDCSCHEMA   API_TESTER_AGNT PROCEDURE    $LastChangedDate: 
2014-04-08 15:33:38 -0500 (Tue, 08 Apr 2014) $
JDCSCHEMA   API_TESTER_AGNT PROCEDURE    $Revision: 1445 $
JDCSCHEMA   API_TESTER_AGNT PROCEDURE    $LastChangedBy: vamsisx $
JDCSCHEMA   API_TESTER_AGNT PROCEDURE    $URL:svn://jdcsubv01/SQL/JDC/Trunk/API_TESTER_AGNT.prc $
于 2014-09-05T13:55:23.750 回答