2011-11-14 122 views
2

目前在我的实践中我使用的版本文件存储:如何在Git/HG/Bzr中找到当前修订版本的最新标记?

 
major=2 
minor=0 
fix=1 

这意味着在产品版本V2.0.1或更新的来源。

每次发布之前,我必须承诺更新此文件,以便与名tag2.0.1标签释放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 ,在点ZZ版本2.0.1

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

我读:

 
    $ hg help revsets 

,但不知道怎样才能找到最近的标记特定的修订。与Git和Bzr我有较少的经验...

或者,如果这是不可能的,我寻找参数。另外我想听听如何避免手动维护VERSION文件(如果可能的话)(或者说为什么这是不可能的)。

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

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

回答

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命令提供相同的信息。但是,您必须了解,默认情况下,它只能使用带注释的标签(详情请参阅手册页)。

+0

我可以使用特殊的版本名称 ''为当前修订。所以现在我使用:** hg log -r。 - 模板“{latesttag} - {latesttagdistance} - {node | short} \ n”**。感谢分享,1+ – gavenkoa

+0

hg -R repo log -r“sort(tag()and ancestors($ REV), - date)”make same。我尝试在Mercurial源代码中搜索此标签... – gavenkoa

+0

** {latesttag} **和** {latesttagdistance} **仅在Mercurial 1.4以后才可用。 – gavenkoa

2

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

+0

你的拳头链接东西损坏,新作品... – gavenkoa

+0

我也读** git help describe **。感谢分享,1+ – gavenkoa

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的简单包装。它会创建一个版本文件,然后将其打包到源代码tarball中,其余内容将由编译过程的其余部分在编译期间烘焙版本号。

+0

我惊讶** - 匹配 **选项!另一个案件采取有意义的标签名称!谢谢你的回答,1+。 – gavenkoa

+0

** GIT-VERSION-GEN **是很好的例子和很好的技术! – gavenkoa

1

bzr tags列出当前分支中的标签(及其相应的修订版)。我认为最近的标签列在第一位,所以你大概可以做这样的事情:

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

嗯...有趣但危险...任何地方1+)) – gavenkoa

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 
+0

** - sort = time ** rocks! – gavenkoa

相关问题