如何移动标签?

时间:2013-08-20 16:15:44

标签: mercurial vcs-tags

我想开始在Mercurial中使用标签。我计划有一个“稳定”的标签,总是指向最后一个好的修订。

据我了解,我可以通过hg tag stable标记当前的变更集。

移动代码的正确方法是什么?当我尝试再次运行hg tag stable时,它会告诉我:

  

abort:标签'stable'已经存在(使用-f强制)

如果我强迫它,我得到this bug没有解决方案或评论。即,它复制旧标签。我甚至不知道为什么标签首先需要在那里不止一次;我只想更新它以指向一个变更集。

3 个答案:

答案 0 :(得分:12)

我没有看到这样的标签'移动'操作,但它实际上是复制某些内容并删除原始内容所以:

hg tag --remove stable
hg tag -r newrevisionhash  stable

或为您的代码添加某种后缀,例如版本号。它还可以让您跟踪您的发布。

意见1:我总是认为mercurial更多是关于保留历史,而在git下你可以改变一些东西,在mercurial中你将不得不覆盖它。

意见2:标记稳定版本的另一种方法是将它们保留在一个分支中。我工作的地方default只保留稳定的代码。所有其他工作都是在孤立的分支机构完成

要更新标签的脏单行:

current=`hg log -l1 --template '{node}'`; hg tag --remove stable; hg tag -r $current stable

似乎这种暴行甚至可以作为.hgrc中的mercurial别名添加:

[alias]
movetag=!(current=`hg log -l1 --template '{node}'`; $HG tag --remove stable; $HG tag -r $current stable)

我捕获当前提示的值,因为标记删除/添加本身就是提交,所以它们“移动”提示(看不出有关标记tip的任何错误 - 它只是为了精确起见) 。肯定有可能使它更漂亮,但那些对我有用。

答案 1 :(得分:7)

您应该使用命名分支,而不是使用移动的标记。它们的功能几乎就像一个移动的标签。

你在上面的评论中写下

  

所有工作都在其他分支上完成,但是当它们准备就绪时我们将它们合并为“默认”,然后执行集成测试。如果合并不好,有一段时间“默认”可能会变得很复杂。因此,我希望在默认情况下保持稳定的标记,并且只在完成/验证集成测试后移动它。

要解决此问题,您需要一个额外的命名分支 - 称之为stable。然后按照您自己的步调将default上经过测试和批准的变更集合并到stable。如果default具有仍在测试的变更集,当变更集X通过测试时,则无关紧要

$ hg update stable
$ hg merge X

将X推广为稳定的变更集。 X的后代(在default上)保持不变,即它们尚未标记稳定。

答案 2 :(得分:3)

正如@guessimtoolate和@Martin Geisler已经指出的那样,您可以使用命名分支来容纳所有良好的修订(这也是我们在公司使用hg的方式)。另一种方法是使用bookmarks,它作为附加到一个修订版的可移动标签。