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

时间:2012-12-07 01:15:01

标签: mercurial

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

2 个答案:

答案 0 :(得分:7)

关键是,如果您删除公共变更集,然后从某个地方再次撤消它,则不会导致任何问题。你只需要恢复原来的变更集。

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

因此,“历史重写”与“历史剥离”不同。


davidmc24由Matt Mackall(Mercurial的父亲)指出this post,他说的基本上是相同的东西

答案 1 :(得分:1)

我不能肯定地说出来,但我的猜测是它“已经过时了”。 hg strip作为mq的一部分开始,在阶段添加至少三年之前。

可能更好的措辞是:

  

不被视为历史重写操作,可用于公共阶段的变更集

当添加阶段时,会采取大量措施来打破任何人的现有工作流程。提交从草案阶段开始,一旦推送就变为 public 。任何阶段感知命令都知道在推送提交阶段后 public 并且不允许修改(除非推送到非发布存储库......)。

但是,有人已经手动使用strip并在脚本中删除已推送的更改集,如果升级后strip突然说“嘿,你不能剥离它上市!”然后那些人就会破坏他们的向后兼容承诺。

阶段正逐渐发展成一个非常惊人的evolve系统,对于几乎所有情况来说,这将是一个比mq更好的选择,但我仍然怀疑我们是否会让马特去除mq和剥离 - 他仍然坚持维护Python 2.4兼容的代码库,并且已经有9年了!

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