Version control 用Mercurial替换关键字

Version control 用Mercurial替换关键字,version-control,mercurial,Version Control,Mercurial,关于Mercurial with keyword expansion extension,我有一个问题:是否可以使用关键字扩展实际的提交消息,以便它出现在源代码中,以便快速参考源代码中的内容 编辑:这似乎有效: 在回购的hgrc中 Log={desc} 但它并不像据称的那样堆叠 使用来源Luke: 跨越多条线路的扩展和增量扩展, 与CV“$Log$”一样,不支持。关键字模板映射“日志”= {desc}“扩展到变更集描述的第一行。关键字只能在一行上扩展,因此您无法获得类似CVS的行为。启用扩展后

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

编辑:这似乎有效:

在回购的hgrc中

Log={desc}
但它并不像据称的那样堆叠

使用来源Luke:

跨越多条线路的扩展和增量扩展, 与CV“$Log$”一样,不支持。关键字模板映射“日志”=
{desc}“扩展到变更集描述的第一行。

关键字只能在一行上扩展,因此您无法获得类似CVS的行为。启用扩展后,这将记录在
hg help keyword

提交消息可以通过in-Mercurial访问,因此您可以添加

[keywordmaps]
Log = {desc}

[keyword]
**.c =
要在所有
.c
文件中展开此行,请执行
$Log$
操作

请注意,关键字扩展名提供了类似于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
那么,
foo.c
最后一次修改是在第10版是正确的,但是说第11版只包含
bar.c
是错误的。
foo.c
文件也是修订版11的一部分-对
bar.c
的更改完全可能取决于对
foo.c
的先前更改,因此修订版11中的快照捕获了
foo.c
bar.c
的状态

当扩展关键字时,它将以每个文件为基础工作:每当您更新到变更集2e85d7f2f93e时,它将
$Log:Fixed bug 123$
写入
foo.c
$Log:Fixed bug 234$
写入
bar.c

如果您想了解上次触摸每个文件的原因和时间,那么这将满足您的需要。如果您想知道存储库的全局状态(例如,将其用作版本字符串)那么这是错误的。问题是,在开发时,
version.h
文件将长期保持不变,因此该文件中的关键字也将保持不变

在这种情况下,您应该只运行
hgid
,作为
Makefile
的一部分。您可以通过以下方式使其更别致:

$ hg parents --template '{latesttag}+{latesttagdistance}-{node|short}\n'

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

只需指出:Mercurial关键字扩展wiki页面建议不要使用它,实际上它不是Mercurial的一部分,而是一个不受支持的扩展。在DVCS中,整个签出始终处于同一版本(不像svn,当你可以进行部分签出时),没有必要使用它,也有很多理由不使用它(使“hg diff”变得很难/不准确)。@Ry4an:让你的评论成为一个答案,我会投票给它:)不,“你真的不想”不是答案。这是真的,但这不是他的要求。@Ry4an:说关键字扩展“不是Mercurial的一部分”和“不受支持的扩展”是错误的。它是使用Mercurial分发的标准扩展。我们为标准扩展提供支持,就像我们为核心代码提供支持一样。@neuro:我觉得这个公平的问题需要一个正确的答案,尽管它有点消极,正如Ry4an已经指出的那样。