【问题标题】:How to move a tag?如何移动标签?
【发布时间】:2013-08-20 16:15:44
【问题描述】:

我想开始在 Mercurial 中使用标签。我打算有一个“稳定”的标签,它总是指向最后一个好的版本。

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

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

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

如果我强制它,我会得到this bug,它没有分辨率或 cmets。即,它复制了旧标签。我什至不知道为什么标签需要不止一次出现在那里;我只想更新它以指向单个变更集。

【问题讨论】:

  • 看起来这是intended behaviour。很奇怪。
  • 您在提交错误时链接到邮件列表上的自动帖子。当前状态是in Bugzilla "RESOLVED INVALID" 并且有注释解释原因。
  • (psst,嘿,你能为 vcs-tags 创建一个 wiki 吗?)
  • @Will:我添加了一些简介。我不是该主题的专家,也不知道它们在不同 VCS 之间有何不同,但希望现在就足够了。

标签: mercurial vcs-tags


【解决方案1】:

我没有看到这样的标签move操作,但它本质上是复制一些东西并删除原来的so:

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 看不到任何错误——这只是为了精确起见)。当然有可能让它更漂亮,但这些对我有用。

【讨论】:

  • 关于选项 2,这基本上就是我们所做的。所有工作都在其他分支上完成,但我们在它们准备好时将它们合并为默认值,然后执行集成测试。如果合并错误,则有一段时间“默认”可能会令人沮丧。因此,我想在默认情况下保留一个稳定的标签,并且只有在集成测试完成/验证后才移动它。
  • 版本号不起作用。那将是一个主要的PITA。我希望每个人在开始处理新问题之前都更新到“稳定”;不能让他们不断查找最新的版本号。版本号可以补充它,但我需要一个始终指最新的版本号。为此必须有某种常见的做法。总是删除标签更好,还是只有几十个相同的标签?实际上,“删除”实际上并没有删除任何东西。它只是向.hgtags 添加一个虚拟记录,然后当您添加一个新记录时,它会像往常一样复制虚拟标签。
  • 好吧,它不再列在例如。 log 输出,所以它做了一些事情。就像我说的——也许跟踪一切只是“反复无常的方式”。我不认为它曾经给我带来麻烦。至于版本号:我见过一个项目,其中部署日期后缀为标签名称(如果顺利的话)——有点多余,但对开发人员来说很方便。
  • Mercurial 的 wiki 说明了 3 种删除标签的方法,您可能对第三种方法感兴趣:removing all references to tagname in .hgtags(但这可能会混淆多头标签冲突分辨率算法) (mercurial.selenic.com/wiki/Tag)。
  • 我不认为删除.htags 中的所有引用实际上会杀死标签。当我运行hg tags 时,它仍然会出现。我想我会继续强迫它,因为这似乎是最简单和最干净的解决方案。不过,我真的不喜欢升级到错误版本的标签。
【解决方案2】:

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

你写在上面的评论里

所有工作都在其他分支上完成,但我们在它们准备好时将它们合并为“默认”,然后执行集成测试。如果合并错误,则有一段时间“默认”可能会令人沮丧。因此,我想在默认情况下保留一个稳定的标签,并且只有在集成测试完成/验证后才移动它。

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

$ hg update stable
$ hg merge X

将 X 提升为稳定的变更集。 X 的后代(default)保持不变,即它们还没有被标记为稳定。

【讨论】:

  • 我在想这个。我认为这解决了跟踪发布的问题,但没有给开发人员一个可以拉动和构建的目标,因为现在他们正在“稳定”分支上构建。他们需要合并回默认或类似的。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多