为什么Mercurial的strip命令不会重写历史记录?

Iod*_*nas 7 mercurial

Mercurial帮助文本说,"strip命令删除指定的变更集及其所有后代." 这听起来非常像重写历史记录,如果有人将他的工作建立在一个突然被删除的变更集之上,那么它必然会引起问题.但是帮助文本还说该命令"不是历史重写操作,可以在公共阶段用于变更集".我确信编写帮助文本的人非常清楚自己在做什么,所以我错过了什么才能理解这一点?

Pau*_*l S 8

关键是如果你剥离一个公共变更集,然后从某个地方再次拉出它,你就没有引起任何问题.您只需返回原始更改集即可.

如果您(例如)将两个公共变更集合在一起,然后从某个地方提取原始变量集,那么您现在有两个分支.一个具有原始的两个变更集,另一个具有折叠的变更集,但两者都具有相同的变化.在那一刻,地狱破裂了,孩子们吃着怪物在地球上漫游.

因此,"历史重写"与"历史剥离"不同.


davidmc24指出Matt Mackall(Mercurial的父亲)的这篇文章中他说的基本相同的东西


Ry4*_*ase 1

我不能肯定地说,但我的猜测是它是“祖父”。hg strip作为其中一部分,mq该项目的开始时间比增加阶段至少早了三年。

可能更好的措辞是:

不被认为是历史重写操作,并且可以在公共阶段的变更集上使用

当添加阶段时,我们会非常小心地避免破坏任何人现有的工作流程。承诺从草稿阶段开始,并在推动后公开。任何阶段感知命令都知道,在推送提交后,提交的阶段是公开的,并且不允许修改(除非推送到非发布存储库......)。

然而,已经有人使用strip手动和脚本来删除已推送的变更集,如果strip在升级后突然说“嘿,你不能剥夺它是公开的!” 那么那些人的向后兼容性承诺就会被打破。

Phases 正在慢慢成长为一个非常惊人的进化系统,在几乎所有情况下,它都是比 mq 更好的选择,但我仍然怀疑我们是否会让 Matt 删除 mq 和 strip ——他仍然坚持维护 Python 2.4 兼容代码库已经有 9 岁了!

Tl;Dr:尽管它strip始终是一个禁用的扩展,但太多人使用它来改变它的行为以及阶段的出现。

  • 这是否意味着“strip”不会_删除_更改集而只是_隐藏_它们?我一直在寻找一种在发布之前从开发中 100%_删除_次要提交的方法。这是安全且非常重要的功能,因为作为开发人员,您应该经常进行本地提交(这是 DVCS 的优点之一,不是吗?),并将“每个功能一次提交”变更集合并到主版本中分支(这是所有主分支的样子,例如来自 Python、Sphinx 等的分支)。有什么方法可以使用 Mercurial 使用“阶段”以明确的方式实现这一目标吗? (2认同)
  • @亚历克西斯你错了。如果您在分支中进行开发,合并到默认值,然后推送,您将推送合并变更集_以及_在分支中创建的所有变更集。变更集不能存在于没有其祖先的存储库中,并且包括其他分支中的变更集。 (2认同)