如何移动标签?

问题描述 投票:7回答:3

我想开始在Mercurial中使用标签。我计划有一个“稳定”标签,该标签始终指向最新的修订版。

据我所知,我可以通过hg tag stable标记当前变更集。

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

中止:标记'stable'已经存在(使用-f强制)

并且如果我强制执行,则会得到this bug,它没有分辨率或注释。即,它复制了旧标签。我什至不知道为什么标签首先需要在其中多次出现;为什么?我只想更新它以指向单个变更集。

mercurial vcs-tags
3个回答
12
投票

我没有看到这样的标记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的任何错误-仅出于精度考虑)。当然,有可能使它更漂亮,但是那些对我有用。


7
投票

代替使用可移动的标签,而应使用命名分支。它们的功能几乎就像一个移动标签。

您在上面的评论中写道

所有工作都在其他分支上完成,但是当它们准备就绪时,我们会将它们合并为'default',然后执行集成测试。在一段时间内,如果合并不正确,则“默认”可能为fubar。因此,我想在默认情况下保留一个稳定的标签,并仅在集成测试完成/验证后才移动它。

要解决这个问题,您需要一个额外的命名分支-命名为stable。然后按照自己的进度将default上经过测试和批准的变更集合并到stable中。 default是否有仍在测试的变更集无关紧要,当变更集X通过测试时,您可以这样做

$ hg update stable
$ hg merge X

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


3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.