2012-04-12 64 views
3

我想在使用hg tag XXX时自动修改我的项目版本。如何在提交标记之前提交文件?

我已成立了一个pretag钩在我的hgrc(注:我已删除,以确保它输出到汞根版本,清晰的东西):

[hooks] 
pretag.bump_version = (echo "$HG_TAG" > VERSION; hg commit -m "Updated VERSION to $HG_TAG" VERSION) 

当我创建一个新标签:

$ hg tag 1.1 

我得到的错误:

warning: ignoring unknown working parent <revision_id>! 

我可以用一个标签钩代替,其成功s,但是那么版本号比标签晚了一个版本:这意味着更新到已标记的版本,然后构建将导致产品的版本号(取决于VERSION文件)将不正确。

有没有更好的方法来处理这个问题?我已经看过SO question #2558531,但是每次更新版本号:我只想在之前更新版本号我标记存储库。

回答

3

切换到pre-tag而不是pretag挂钩。钩子pretag是一个特别的钩子,它意识到你正在标记。相比之下,pre-tag挂钩是一个通用的pre-*钩子,它在标签命令启动之前运行,并且完全不知道它是标记 - 这意味着它也可以更早运行。 (甚至有一些预设的钩子,例如,pre-log)。

我得到了你的例子是这样的工作:

[hooks] 
pre-tag.bump_version = echo $HG_ARGS > VERSION; hg commit -m "updated version to $HG_ARGS" VERSION 

使用命令行只是看上去像:

[email protected]:~$ hg init tagtest 
[email protected]:~$ cd tagtest 
[email protected]:~/tagtest$ echo text > VERSION 
[email protected]:~/tagtest$ hg commit -A -m initial 
adding file 
[email protected]:~/tagtest$ hg tag --config hooks.pre-tag='echo $HG_ARGS > VERSION; hg commit -m "updated version to $HG_ARGS" VERSION' 1.1 

通知我的说法切换到$HG_ARGS因为它是一个pre-*命令那不知道我们正在标记。详细信息位于hgrc联机帮助页面中。

另请注意我在提交时只提交了VERSION文件,因为它明确命名。您不希望意外地提交一大堆调试内容,这些调试内容只是因为您已标记而从以前的提交中排除。

+0

谢谢瑞安。是的,我只是提交VERSION文件,但是当我在这里输入时,它被简化了。 – 2012-04-12 14:09:22

+0

很酷。您可能会注意到,'tag'命令也在'$ HG_ARGS'变量中结束。如果这是个问题,你可以使用'$ {HG_ARGS#tag}'来代替它。这是一场深奥的魔术。 – 2012-04-12 14:39:32

+0

超级。我刚刚提出了'set-junk $ HG_ARGS',然后使用'$ 3'作为标签。你看起来更好,但在标签值之前留下一个空格。 – 2012-04-12 22:26:09