Mercurial有类似于git的“describe”功能吗?

14

我目前正在将一个在Mercurial中维护的东西添加到打包中。当前的版本是在Makefile中定义的。我希望改变这个,以便可以构建每日打包或正确版本化的打包。

Git提供了一个"use describe"函数,可以给出最接近的已标记版本和当前修订的描述。例如,如果我在内核中运行以下命令:

git describe HEAD

GIT 返回:

v3.0-rc7-68-g51414d4

告诉我修订版本晚于v3.0-rc7,git提交ID为51414d4。

在Mercurial中有类似的东西可以做吗?


4
对于那些不懂git但懂Mercurial的人,您能否概述您想要的输出以及原因?这将增加有人能够回答的可能性。 - Lasse V. Karlsen
亲爱的楼主:如果您有时间,请将勾选标记从旧答案移至新答案。新答案更好。 - unforgettableidSupportsMonica
2个回答

12
也许可以像这样做?
hg log -r . --template '{latesttag}-{latesttagdistance}-{node|short}\n'

当然,你应该使用AliasExtension来创建一个别名。

需要注意的是,与“git describe”不同,这个命令将始终显示“latesttagdistance”和“node|short”部分,而不是在latesttagdistance为0时省略它们。


也可能使用revsets实现。 - tonfa
这个字符串是否像 git describe 一样保证是一个有效的 refspec? - nocnokneo

7
这是对git describe的近似模拟:
hg log -r . -T "{latesttag}{sub('^-0-.*', '', '-{latesttagdistance}-m{node|short}')}"
{sub(...)}函数确保工作副本完全处于标签v0.1.0,将显示为v0.1.0而不是v0.1.0-0-m123456789abc
请注意,在哈希之前的m是用于mercurial的,类似于git describe使用g来表示git。
为了方便起见,请将以下内容添加到您的~/.hgrc中以创建别名:
[alias]
describe = log -r . -T "{latesttag}{sub('^-0-.*', '', '-{latesttagdistance}-m{node|short}')}"

然后只需键入hg describe即可使用别名。

如果您想模拟git describe --dirty,事情会变得更加混乱 - 但是您仍然可以将其全部隐藏在一个hg别名中:

[alias]
describe = !
    dirtymark=;
    case " $1 " in " --dirty ") dirtymark=-dirty; ;; esac;
    echo $($HG log -r . --template "{latesttag}-{latesttagdistance}-m")$($HG id -i) |
        sed -r -e "s/\+\$/${dirtymark}/" -e 's/-0-m[[:xdigit:]]+//'

现在运行hg describe --dirty将会生成以下字符串:
  1. v0.1.0
  2. v0.1.0-dirty
  3. v0.1.0-1-mf6caaa650816
  4. v0.1.0-1-mf6caaa650816-dirty
如果省略--dirty选项,即使工作副本包含未提交的更改,也永远不会得到像(2)和(4)那样的-dirty后缀。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接