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

sts*_*uad 11 mercurial

我目前正在为Mercurial中维护的东西添加包装.目前,该版本在Makefile中定义.我想改变它,以便我可以构建每日包或正确版本化的包.

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

git describe HEAD
Run Code Online (Sandbox Code Playgroud)

GIT返回:

v3.0-rc7-68-g51414d4
Run Code Online (Sandbox Code Playgroud)

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

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

ckr*_*use 12

也许是这样的?

hg log -r . --template '{latesttag}-{latesttagdistance}-{node|short}\n'
Run Code Online (Sandbox Code Playgroud)

当然你应该用AliasExtension为它做一个别名.

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


noc*_*neo 6

这是一个接近的模拟git describe:

hg log -r . -T "{latesttag}{sub('^-0-.*', '', '-{latesttagdistance}-m{node|short}')}"
Run Code Online (Sandbox Code Playgroud)

{sub(...)}函数确保完全在标签处的工作副本v0.1.0将显示为v0.1.0和不显示v0.1.0-0-m123456789abc.

需要注意的是,m之前的哈希是 ercurial,类似的方式git describe使用g用于吧.

为方便起见,请通过在以下内容中添加以下内容来创建别名~/.hgrc:

[alias]
describe = log -r . -T "{latesttag}{sub('^-0-.*', '', '-{latesttagdistance}-m{node|short}')}"
Run Code Online (Sandbox Code Playgroud)

然后只需键入即可使用别名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:]]+//'
Run Code Online (Sandbox Code Playgroud)

现在运行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选项意味着-dirty即使工作副本包含未提交的更改,您也永远不会得到类似(2)和(4)的后缀.