Mercurial是否有相当于git的“describe”功能?

时间:2011-07-14 12:36:01

标签: mercurial

我目前正在将包装添加到Mercurial中维护的内容中。目前,该版本在Makefile中定义。我想改变它,以便我可以构建每日软件包或正确版本化的软件包。

Git提供了一个用途"描述"函数,可以为您提供最接近标记的构建和当前版本的描述。例如,如果我在内核中运行它:

git describe HEAD

GIT返回:

v3.0-rc7-68-g51414d4

告诉我修改时间晚于v3.0-rc7,git委托为51414d4

我可以在Mercurial中做些类似的事情吗?

2 个答案:

答案 0 :(得分:12)

也许是这样的?

hg log -r . --template '{latesttag}-{latesttagdistance}-{node|short}\n'

当然,您应该使用AliasExtension为其创建别名。

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

答案 1 :(得分:6)

这是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用于 m ,这与git describe使用g g 它。

为方便起见,请将以下内容添加到~/.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
  5. 省略--dirty选项意味着即使工作副本包含未提交的更改,您也永远不会获得{2}和(4)之类的-dirty后缀。