我对Mercurial有一个关于关键字扩展扩展的问题:是否可以使用关键字扩展实际的提交消息,以便它出现在源代码中以便快速参考源代码中的内容?
编辑:这似乎有效:
在repo的hgrc
Log={desc}
但它并没有堆叠,因为它据称是CVS对手。
使用Source,Luke:
跨越多条线和增量扩展的扩展, 喜欢CVS'$ Log $,不受支持。关键字模板映射“Log = {desc}“扩展到变更集描述的第一行。
答案 0 :(得分:6)
关键字只能扩展到一行,因此您无法在log messages keep accumulating处获得类似CVS的行为。启用扩展程序后,hg help keyword
会记录此信息。
可以使用Mercurial中的{desc}
template keyword访问提交消息,因此您可以添加
[keywordmaps]
Log = {desc}
[keyword]
**.c =
让所有$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
然后在修订版10中最后更改了foo.c
是正确的,但是说修订版11只包含bar.c
是错误的。 foo.c
文件也是修订版11的一部分 - 对bar.c
的更改取决于先前对foo.c
的更改以及快照的更改完全合理版本11捕获foo.c
和bar.c
的状态。
keyword extension在扩展关键字时基于每个文件工作:只要您更新,它就会将$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'
将输出类似2.1+117-eed1e5bba9a8
的字符串。这意味着您当前的版本(eed1e5bba9a8)在最后一个标记(2.1)之后提交了117次。这使得用户可以轻松地比较来自同一中央存储库的构建,如果需要,您仍然可以唯一地再现构建。