Mercurial - 在提交

时间:2015-10-22 09:02:48

标签: mercurial commit mercurial-hook

我们正在寻找一种在提交期间提交的每个文件的开头添加/更新自定义标记的方法。它是我们需要的某种本地时间戳。

我在想钩子。

不幸的是我找不到有用的钩子:

  1. precommit:不合适,因为它在之前触发 hg知道提交的任何元数据
  2. pretxncommit:不合适,因为文档明确指出我们此时不应更改工作目录
  3. commit:不合适,因为它在提交已经发生时触发。
  4. 编辑:

    我不能使用hg的内联changeset-hash和/或datetime。原因如下: 我们的文件后来导入到外部系统(我们无法控制),不支持任何类型的版本控制。

    简化内容:让我们说标记是一个不断增加的数字。 (每次我们承诺)。然后,此标记用于帮助了解系统中文件的版本/状态文件中的文件 - 例如" no 。我们失去的变化"等等。

    有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我建议采用两阶段解决方案。首先,按以下行创建别名:

[alias]
tcommit = !tag-changed-files && $HG commit "$@"

此处,tag-changed-files会通过$HG status -ma -n$HG status -ma -n -0检索已修改和已添加/移动的文件列表,并对其进行标记。我假设重新标记已修改但尚未提交的文件是无害的操作;更多关于以下内容。请注意,如果您绝对想要通过以下方式重新定义提交:

[alias]
commit = !tag-changed-files && $HG --config alias.commit=commit commit "$@"

但是,这可能存在问题,因为它可能会混淆脚本。

如果您愿意,还可以在程序中集成提交步骤,甚至尝试解析命令行参数以仅标记您提交的文件。对于这种方法,使用hglib可能适合避免多次调用Mercurial的开销。 (请注意,使用command server的hglib和其他工具会忽略别名和命令默认值,因此即使您使用别名提交也可以。)

其次,您安装了一个pretxncommit挂钩,用于验证正在提交的文件是否确实已被正确标记(以确保tag-changed-files程序未被绕过事故)。

这应该在完全提交时没有问题;对于部分提交,任何已更改但尚未提交的文件也将被重新标记,但由于它们将在稍后提交(并在该点正确标记)或还原,因此应该是无害的。

答案 1 :(得分:1)

  

关于repo

中文件的系统文件版本/状态的概念

只有一个想法

停止重新发明轮子

增量计数器只是狗屎,如果您的任务是“知道哪个版本在LIVE上,哪个版本在Mercurial的提示中”(并且这是您真正的业务任务,是吗?!)

Keyword Extension为您提供每个文件的最后更改

如果你想将存储库的变更集注入文件(这是合理的好方法),请重新阅读wiki-page的这一部分

  

如果您只想对整个仓库进行版本控制,请不要使用它   扩展,但让你的构建系统来处理它。一些东西   

的行
hg -q id > version
     如果文件明智的关键字,

分发之前可能已经足够了   在源头扩展并非绝对必要

您可以在导出阶段(以planetmaker的sed风格)将hg id输出插入文件中,您也可以在VCS中永久保存这些额外的元数据,并使用特殊的encode|decode filters

答案 2 :(得分:0)

据我所知,没有内在的系统支持你所描述的内容。但是,我可以推荐一种从存储库构建软件发行包中采用的方法:创建一个小的导出脚本,用您需要的版本信息替换文件中的某个KEYWORD。 Makefile目标可能看起来像是为修订版XXX创建了一个zip导出,其中包含支持它的所有文件中的版本信息(因此包含了逐字的KEYWORD - 在这里使用真正独特的东西):

VERSION=$(hg log -rXXX --template="Version: {node|short} from {date|isodate}")

export:
  hg archive -rXXX -t files export
  for i in $(hg ma -rXXX); do sed -i "s/KEYWORD/$VERSION/g" $i; done
  zip -9rq export.zip export

我在Makefile中使用了类似的方法,我为我的软件的特定版本的源创建版本化导出。

编辑:如果您的目的(如评论中所述)仅用于植入对该文件的提交次数:那么您可以使用预提交挂钩并修改该文件。您可以使用hg log FILENAME --template="{node}\n" | wc -l计算对文件所做的修改次数。为每个文件执行此操作,并在预提交挂钩中的每个文件的标头中执行sed替换。