我想开始在Mercurial中使用标签。我计划有一个“稳定”的标签,总是指向最后一个好的修订。
据我了解,我可以通过hg tag stable
标记当前的变更集。
移动代码的正确方法是什么?当我尝试再次运行hg tag stable
时,它会告诉我:
abort:标签'stable'已经存在(使用-f强制)
如果我强迫它,我得到this bug没有解决方案或评论。即,它复制旧标签。我甚至不知道为什么标签首先需要在那里不止一次;我只想更新它以指向一个变更集。
答案 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,它作为附加到一个修订版的可移动标签。