Mercurial 如何移动标签?
我想开始在Mercurial中使用标记。我计划有一个“稳定”标签,它总是指向最后一次好的修订 据我所知,我可以通过Mercurial 如何移动标签?,mercurial,vcs-tags,Mercurial,Vcs Tags,我想开始在Mercurial中使用标记。我计划有一个“稳定”标签,它总是指向最后一次好的修订 据我所知,我可以通过hg tag stable标记当前变更集 移动标签的正确方法是什么?当我尝试运行hg tag stable时,它再次告诉我: 中止:标记“稳定”已存在(使用-f强制) 如果我强迫它,我会得到一个没有决议或评论的结果。i、 例如,它复制了旧标签。我甚至不知道为什么标签一开始就要放在那里不止一次;我只想将其更新为指向单个变更集。我没有看到这样的标记移动操作,但它本质上是复制某些内容并删除
hg tag stable
标记当前变更集
移动标签的正确方法是什么?当我尝试运行hg tag stable
时,它再次告诉我:
中止:标记“稳定”已存在(使用-f强制)
如果我强迫它,我会得到一个没有决议或评论的结果。i、 例如,它复制了旧标签。我甚至不知道为什么标签一开始就要放在那里不止一次;我只想将其更新为指向单个变更集。我没有看到这样的标记移动操作,但它本质上是复制某些内容并删除原始内容,因此:
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
中添加为易变的别名:
[alias]
movetag=!(current=`hg log -l1 --template '{node}'`; $HG tag --remove stable; $HG tag -r $current stable)
我捕获了当前tip的值,因为标记移除/添加本身就是提交,所以它们会“移动”tip(看不出标记
tip
——这只是为了精确起见)。当然,有可能使它更漂亮,但这些对我来说很有用。你应该使用命名分支,而不是移动标签。它们的功能几乎像一个移动的标签
你在上面写评论
所有的工作都在其他分支上完成,但当它们准备好后,我们将它们合并到“默认”中,然后执行集成测试。有一段时间,如果合并失败,“默认值”可能是fubar。因此,我希望在默认情况下保持一个稳定的标记,并且只在集成测试完成/验证后移动它
要解决这个问题,您需要一个额外的命名分支-称它为stable
。然后以自己的速度将default
上经过测试和批准的变更集合并到stable
中。无论default
是否有仍在测试中的变更集,当变更集X通过测试时,您都会这样做
$ hg update stable
$ hg merge X
将X提升为稳定的变更集。X的后代(在
默认值上)保持不变,即它们尚未标记为稳定。正如@gustimtoolate和@Martin Geisler已经指出的,您可以使用命名分支来容纳所有良好的修订(这也是我们在公司使用hg的方式)。另一种方法是使用,它充当附加到一个修订版上的可移动标签。看起来像这样。奇怪。提交错误时,你链接到邮件列表上的自动帖子。当前状态为“已解决无效”,并且有一条注释解释了原因。(psst,嘿,你能为vcs标签创建一个wiki吗?@Will:我添加了一个小广告。我不是这方面的专家,也不是不同风投之间的差异,但我希望这就足够了。关于选项2,我们基本上就是这么做的。所有的工作都在其他分支上完成,但当它们准备好时,我们将它们合并到默认值中,然后执行集成测试。有一段时间,如果合并失败,“默认值”可能是fubar。因此,我希望在默认值上保留一个稳定的标记,并且只在集成测试完成/验证后移动它。版本号不起作用。那将是一个重要的PITA。我希望每个人在开始处理新问题之前更新到“稳定”;不能让他们不断查找最新版本号。版本号可以补充它,但我需要一个总是指最新的。对此,一定有某种常见的做法。总是移除标签是更好的选择,还是仅仅在那里放置几十个相同的标签?事实上,“移除”并没有移除任何东西。它只是在.hgtags
中添加一个虚拟记录,然后当您添加一个新记录时,它会一如既往地复制虚拟标记。它不再列在例如日志
输出中,因此它会做一些事情。就像我说的——也许跟踪每件事只是“变化无常的方式”。我不认为这会给我带来麻烦。关于版本号:我见过一个项目,其中部署日期的后缀是标记名(如果进展顺利的话)——有点多余,但对开发人员来说很方便。Mercurial的wiki说明了3种删除标记的方法,第三种方法可能会让您感兴趣:删除.hgtags中对标记名的所有引用(但这可能会混淆多头部标记冲突解决算法)()。我不认为删除.htags
中的所有引用实际上会杀死标记。当我运行hg tags
时,它仍然会出现。我想我会继续强制执行它,因为这似乎是最简单和最干净的解决方案。不过,我真的不喜欢使用错误版本的标记的可能性。我正在考虑这个问题。我认为这解决了跟踪发布的问题,但没有给开发人员一个目标,因为他们现在正在“稳定”分支上构建。他们需要合并回默认值或类似的版本。