你如何在 hg 中拥有一个非常频繁提交的工作流程?

How do you have a workflow in hg, where one does very frequent commits?

我的工作流程是进行非常频繁的提交和推送,然后当我准备好后,将这些提交合并为一个提交(使用 histedit 等)来清理日志。

对于 git,我会做一个变基并推送。留下的悬空头不会乱扔我的日志,最终会被垃圾收集。

使用 mercurial,我最终得到了多个头。如果我关闭分支以摆脱陈旧的头部,我最终会得到一百万个仍然显示在日志中的关闭分支。这违背了最初的目的。

如何在不完全搞砸日志的情况下在 Mercurial 中实现这样的工作流程?是否有在 mercurial 下工作的替代工作流程?

请注意,频繁的提交也会被推送到存储库(只是为了安全)。这意味着我不能完全使用像 strip 这样的东西。

考虑一下 evolve 扩展,它在 this post 中有最好的解释,尽管它不是特定于 bitbucket 的,并且在 Mercurial 环境中得到广泛支持。您可能已经安装了它,只需要启用它。

一旦你理解了它,它就是世界上最好的。它让一个提交替换另一个提交——它会废弃另一个,即使它已经被推送了。它允许您以 不会 中断已经推送的提交的方式重新编写提交。将其视为 git --amendgit rebase 但对于已推送的内容是安全的。

当您推送一个废弃了一个或多个其他变更集的变更集时,为这些变更集推送过时标记,随后从该回购中提取的任何人都会在他们的 history/log 中用什么替换过时的变更集你推了。过时的变更集仍然存在,但它们不会使日志混乱。

我希望我们很快在 git 中得到类似的东西 -- 一些人已经开始研究类似的功能。

虽然 @Ry4an 确实建议 The Best Way (tm),但您可以使用另一种方式,仅 "classic" 已发布的工具

  1. 在推送目标上使用 [phases] publish=False(阅读和理解 phases) (see also After pushing to a review repository, "abort: can't rebase immutable changeset" on rebase and http://www.logilab.org/blogentry/88203 以介绍阶段)
  2. 使用任意历史重写方法
  3. 如果将变异的历史推送到不发布的 repo 仍然会创建额外的头部(我懒得为你测试) - 通过使用 [= 消除所有不需要的匿名分支(具有 "dirty" 历史) 12=] - 历史上你会有很多合并集,但只有一个真正的头