Mercurial - 在提交时向提交的文件添加标签

Mercurial - Add tag to committed files on commit

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

我在想钩子。

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

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

编辑:

我无法使用 hg 的内联变更集哈希和/或日期时间。原因如下: 我们的文件稍后会导入到不支持任何版本控制的外部系统(我们无法控制)。

为简化起见:假设 tag 是一个不断递增的编号。 (每次我们提交)。然后使用此标记帮助了解系统上文件相对于回购中的文件的版本/状态 -像 "no. of changes we're missing" 之类的。

有什么想法吗?

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

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 中使用了类似的方法,我在其中为我的软件的特定修订的源创建版本化导出。

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

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

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

此处,tag-changed-files 将通过 $HG status -ma -n$HG status -ma -n -0 检索已修改和 added/moved 文件的列表并标记它们。我假设重新标记已修改但尚未提交的文件是无害的操作;更多关于下面的内容。请注意,如果您绝对想通过:

,您甚至可以重新定义提交
[alias]
commit = !tag-changed-files && $HG --config alias.commit=commit commit "$@"

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

如果您愿意,您也可以将提交步骤集成到程序中,甚至可以尝试解析命令行参数以仅标记您正在提交的那些文件。对于这种方法,使用 hglib might be appropriate to avoid the overhead of invoking Mercurial multiple times. (Note that hglib and other tools that use the command server 忽略别名和命令默认值,因此即使您为 commit 添加别名也能正常工作。

其次,您将安装一个 pretxncommit 钩子来验证正在提交的文件确实已被适当标记(以确保 tag-changed-files 程序没有被意外绕过) .

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

an idea of the version / status of the file on the system in respect to the file in the repo

一个想法

停止重新发明轮子

增量计数器只是狗屎,如果你的任务是"to know, which version is on LIVE and which - in Mercurial's tip"(并且这是你真正的业务任务,是吗?!)

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

如果您想将存储库的变更集注入文件(这是合理的好方法),请重新阅读维基页面的这一部分

If you just want to version your entire repo, do not use this extension but let your build system take care of it. Something along the lines of

hg -q id > version

before distribution might be well enough if file-wise keyword expansion in the source is not absolutely required

您可以在导出阶段(以 planemaker 的 sed 样式)将 hg id 输出插入到文件中,但您也可以使用特殊 encode|decode filters[=16 将此附加元数据永久保存在 VCS 中的文件中=]