我想开始在Mercurial中使用标签。我计划有一个“稳定”标签,该标签始终指向最新的修订版。
据我所知,我可以通过hg tag stable
标记当前变更集。
移动标签的正确方法是什么?当我再次尝试运行hg tag stable
时,它会告诉我:
中止:标记'stable'已经存在(使用-f强制)
并且如果我强制执行,则会得到this bug,它没有分辨率或注释。即,它复制了旧标签。我什至不知道为什么标签首先需要在其中多次出现;为什么?我只想更新它以指向单个变更集。
我没有看到这样的标记move操作,但它实际上是在复制某些内容并删除原始内容,因此:
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
的任何错误-仅出于精度考虑)。当然,有可能使它更漂亮,但是那些对我有用。
代替使用可移动的标签,而应使用命名分支。它们的功能几乎就像一个移动标签。
您在上面的评论中写道
所有工作都在其他分支上完成,但是当它们准备就绪时,我们会将它们合并为'default',然后执行集成测试。在一段时间内,如果合并不正确,则“默认”可能为fubar。因此,我想在默认情况下保留一个稳定的标签,并仅在集成测试完成/验证后才移动它。
要解决这个问题,您需要一个额外的命名分支-命名为stable
。然后按照自己的进度将default
上经过测试和批准的变更集合并到stable
中。 default
是否有仍在测试的变更集无关紧要,当变更集X通过测试时,您可以这样做
$ hg update stable
$ hg merge X
将X推广为稳定的变更集。 X的后代(在default
上)保持不变,即尚未标记为稳定。
正如@guessimtoolate和@Martin Geisler所指出的,您可以使用命名分支来容纳所有良好的修订版(这也是我们在公司使用hg的方式)。另一种方法是使用bookmarks,它用作附加到一个修订版的可移动标签。