关键字用Mercurial代替

Fre*_*ddy 5 version-control mercurial

我对Mercurial有一个关于关键字扩展扩展的问题:是否可以使用关键字扩展实际的提交消息,以便它出现在源代码中以便快速参考源代码中的内容?

编辑:这似乎工作:

在repo的hgrc

Log={desc}
Run Code Online (Sandbox Code Playgroud)

但它并没有堆叠,据说CVS对应的确如此.

使用来源,卢克:

不支持跨越多行和扩展的扩展,如CVS'$ Log $.关键字模板映射"Log = {desc}"扩展为变更集描述的第一行.

Mar*_*ler 6

关键字只能扩展到一行,因此您无法在日志消息不断累积的情况下获得类似CVS的行为.hg help keyword启用扩展后会记录此信息.

可以使用Mercurial中的{desc}template关键字访问提交消息,因此您可以添加

[keywordmaps]
Log = {desc}

[keyword]
**.c =
Run Code Online (Sandbox Code Playgroud)

已经$Log$在所有产品线扩大这个.c文件.

请注意,关键字扩展按照每个文件的方式提供类似CVS的世界视图.Mercurial通常在存储库范围内工作.如果你这样做

$ hg commit -m "Fixed bug 123" foo.c    # create changeset 10:84e0d0dc9ce5
$ hg commit -m "Fixed bug 234" bar.c    # create changeset 11:2e85d7f2f93e
Run Code Online (Sandbox Code Playgroud)

那么它foo.c在修订版10中最后一次更改是正确的,但是说修订版11只包含它是错误的bar.c.该foo.c文件还修订11的一部分-这是完全可行的变化bar.c依赖于以前的变化foo.c,因此该快照在修订11同时捕捉的状态foo.cbar.c.

关键字扩展是基于每个文件的基础上扩张时的关键字:将编写$Log: Fixed bug 123 $foo.c$Log: Fixed bug 234 $bar.c,只要你更新到变更集2e85d7f2f93e.

如果你想知道为什么以及最后一次触摸每个文件的时间,那么这将做你想要的.如果您想知道存储库的全局状态 - 例如将其用作版本字符串! - 那是错的.问题是您的version.h文件在开发时会长时间保持不变,因此该文件中的关键字也将保持不变.

在这种情况下,你应该真的只是hg id作为你的一部分Makefile.你可以通过以下方式使它变得更加花哨:

$ hg parents --template '{latesttag}+{latesttagdistance}-{node|short}\n'
Run Code Online (Sandbox Code Playgroud)

这将输出一个字符串2.1+117-eed1e5bba9a8.这意味着您当前的版本(eed1e5bba9a8)在最后一个标记(2.1)之后提交了117次.这使得用户可以轻松地比较来自同一中央存储库的构建,如果需要,您仍然可以唯一地再现构建.