Mercurial:提交或推送时更新文件

时间:2013-06-06 17:18:54

标签: file mercurial auto-update

目前,我的团队正在使用Mercurial。

在之前的工作环境中,我们使用了CVS,然后使用了Subversion,并且设置了当我们在java类中检查字段已更新时。

public class MyObject
{
    private static final String ID = "$Id: MyObject.java 10000 2008-11-14 16:20:10Z userid $";

    // rest of class
}

开头的$Id:和结尾的$用作正则表达式分隔符。当我们进行提交时,更新了ID字符串,使10000增加到10001,更新为提交时间,将userid更新为提交者。这在查看部署的代码并且需要确切知道部署的类的版本时会派上用场,因为您可以对类文件执行strings命令并读取该字符串。

我们在Maven和更好的构建/依赖管理工具之前就已经开始了这一点,而且大部分都不再需要了。

然而,我们遇到了一个项目被合并/更新的情况,中心的Mercurial仓库从某人的本地仓库重建,并且构建完成后恢复了Maven版本号......这有点乱。我们不确定当前部署的类的版本是什么。

有没有什么方法可以将Mercurial设置为在提交或推送到中央存储库时执行此类更新?我无法找到任何东西,但有时那是因为搜索条件错误。

2 个答案:

答案 0 :(得分:2)

您可以使用至少两种更简单(和更正确的BTW)方式

  • 关键字(关键字中的任何关键字,关键字中的任何数据),控制我的Mercurial - 请参阅Keyword Extension(而不是SVN样式的修订号,使用不可变的变更集哈希作为ID)
  • 您无法在SCM代码中执行任何操作,但在构建|部署阶段添加所需数据 - 阅读扩展程序wiki-page的“概述”部分。而不是hg id你可能更喜欢以同样的方式使用MercurialRev,如Subversion的SubWCRev - 存储库存储模板文件,它必须由词法分析器处理,并且只有产品中使用的最终文件

答案 1 :(得分:1)

您可以使用Mercurial Hooks。更具体地说,预提交挂钩(你可以在hgrc help上找到关于它的信息)。

例如,要在每次提交之前在文件上写入当前日期,请在hgrc中设置(在~/.hgrcproject/.hg/hgrc上):

[hooks]
pre-commit = date > file.txt

必须使用在执行提交之前运行的命令设置预提交设置。对于您的情况,您可以编写一个shell脚本 cat sed 您的java文件,以使用新的日期和修订号更新ID。

这个解决方案的缺点是你必须在每个开发人员的机器上“部署”hgrc,以便每次都执行钩子。