如何在Git / HG / Bzr中找到当前版本的最新标签?

时间:2011-11-14 20:02:56

标签: git version-control mercurial branch bazaar

目前在我的实践中我使用VERSION文件存储:

major=2
minor=0
fix=1

表示产品版本v2.0.1或更新版本的来源。

在每次发布之前,我必须提交对此文件的更新,因此标记为 tag2.0.1 release-2.0.1 的标记覆盖上面的内容(而不是以前的版本!)

我认为可以通过从构建脚本自动生成VERSION文件来避免此作业。

了解转历史:

  +--+-----+----------------------+-YY--+----+------+------+-HH-->
  dev|     |            ^     ^   |     |    |      |      |
     |     |            |     |   |     |    v      v      v
     |     |            |     |   |     |    +--+------+-ZZ---+-->
     |     |            |     |   |     |    b2 |      |      |
     |     |            |     |   |     |       v      v      v
     |     |            |     |   |     |      t2.0.0 t2.0.1 t2.1.0
     v     v            |     |   v     v
    t0.1.0 +---+--XX--+-+---+-+-----+------+------+------+------+--->
           b1  |      |     |       |      |      |      |      |
               v      v     v       v      v      v      v      v
              t1.0.0 t1.0.1 t1.0.2 t1.1.0 t1.2.0 t1.2.1 t1.2.2 t1.2.3

XX 版本 1.0.0 ,点 YY 版本 1.0.2 ,at点 ZZ 版本 2.0.1

对于点 HH 是不知道如何设置版本。我认为它必须是 1.0.2 ,因为我们没有将 dev 分支与发布分支 b2 合并。

我看了:

  $ hg help revsets

但是看不出如何找到给定修订版的最近标签。有了Git和Bzr,我的经验不足......

如果这不可能,我会寻找争论。另外,我想听听如果可能的话,如何避免手动维护VERSION文件(或者为什么不可能这样做。)

PS。 VERSION文件需要维护程序包相关性并在用户反馈中识别产品源状态。

PSS。 与给定修订术语最接近的标记可能看起来模糊,但每个开发人员都可以说出它的工作版本。为什么这不能做机器?

5 个答案:

答案 0 :(得分:5)

您可以使用以下内容:

hg log --template "{latesttag}-{latesttagdistance}-{node|short}\n" --rev <REV>

返回如下字符串:

  

2.1.4-2-12eeab7a8073

这告诉我们:

  • 此次提交前的最新标记是2.1.4
  • 当前版本是超过该标记的2次提交
  • 变更集ID为12eeab7a8073

了解更多信息,请阅读templates

Git具有内置describe命令,可提供相同的信息。但是,您必须了解默认情况下它仅适用于带注释的标记(有关详细信息,请参见手册页)。

答案 1 :(得分:3)

bzr tags --sort=time | tail -n1 | cut -d ' ' -f1

改编自dOxxx的答案。我看到标签通常按名称排序,但可以按时间对参数进行排序。

您甚至可以使用extcommand插件创建外部bzr别名。 bzr branch http://bzr.oxygene.sk/bzr-plugins/extcommand/ ~/.bazaar/plugins

然后,您可以将以下内容添加到~/.bazaar/bazaar.conf

[EXTERNAL_ALIASES]
last-tag = bzr tags --sort=time | tail -n1 | cut -d ' ' -f1

然后你可以这样做:

$bzr last-tag
v0.9.0-SNAPSHOT

答案 2 :(得分:2)

你看过git describe git了吗?它将显示可以从提交中访问的最新标记。

答案 3 :(得分:2)

Git有一个专门为此设计的命令:git-describe。具体如何使用它取决于您的需求,但一般来说,git describe [opts] <commit>生成<tag>-<n-commits>-<short-hash>形式的东西,告诉您最新的标记,自那时以来已经提交了多少次提交,以及缩写的哈希提交。例如,它可以为您提供v1.7.8-rc0-32-g87bf9a7

相关选项:

  • --tags - 包含所有标记,而不仅仅是带注释的标记。你可能想要这个。
  • --match <pattern> - 仅包含与给定模式匹配的标记,因此您可以将自己限制为版本标记,而不是任何无关的标记。
  • --abrev=<n> - 使用哈希的n位数(设置为0来抑制它)

还有其他几个 - 请参阅联机帮助页。

关于您的VERSION文件:您通常不应该跟踪它。必须对其进行修改是弄巧成拙的;提交包含文件,因此当您修改并提交时,(略微)更改版本。相反,您可以在构建/部署过程中自动生成它,并将其包含在源分发中。你可以在Git的源代码中找到一个很好的例子 - 有一个名为GIT-VERSION-GEN的脚本,它由Makefile调用,实际上是一个围绕git-describe的轻量级包装器。它会创建一个版本文件,然后将其打包到源代码压缩包中,其内容将由构建过程的其余部分用于在编译期间烘焙版本号。

答案 4 :(得分:1)

bzr tags列出当前分支中的标记(及其相应的修订版)。我相信最新的标签首先列出,所以你可能会做这样的事情:

bzr tags | head -n1 | cut -d ' ' -f1