怎样做而不是在Mercurial中压缩提交

时间:2012-10-26 00:18:29

标签: mercurial push changeset

每次保存任何内容时,我的IDE设置都会在本地提交。理想情况下,我希望保留一份未经审查的记录,记录我的愚蠢记忆,以便在极少数情况下使用它们。但大部分时间它都使我的历史变得详细。

我想知道保持这段历史的好策略,但大部分时间都可以忽略它。我每次保存时都会运行自己的脚本,所以我可以控制它。

我对Mercurial很新,所以我需要一个基本的答案。但是,在提交,合并和报告时我应该做的所有步骤是什么,以便能够主要忽略这些自动提交,但实际上却没有压缩它们?或者我最好放弃而只是挤压?

Related question about how to squash with highly rated comment suggesting it might be better to keep that history

编辑 - 我的观点是,如果Mercurial希望保留所有历史记录(我同意这一点),它应该让您过滤该历史记录以避免看到您可能想要压制的东西。我宁愿来压缩,我只是在策略中寻求帮助(在常规使用中,尽管不是总是如此)让它看起来尽可能多,就像我压扁了我的历史。 / p>

4 个答案:

答案 0 :(得分:4)

您希望在回购中保留详细的历史记录,但是您希望(并能够导出)仅包含“合理”修正的理想化历史记录,对吧?我可以同情。

解决方案1:使用标记标记历史记录中的有趣点,并学会忽略它们之间的所有杂乱位。

解决方案2:使用两个分支并合并。在分支default中进行开发,并保持并行分支release。 (您可以将其称为clean,但实际上您正在管理版本)。每当default处于您想要检查点的稳定状态时,切换到分支release合并到当前状态default - 批量生效如果你希望。如果您从不直接向release提交任何内容,则永远不会发生合并冲突。

 (original branch) --o--o--o--o--o--o--o    (default)
          \              \        \
           r   ... ...  --r--------r        (release)

结果:您可以更新到release的任何修订版并期望运行状态。您可以运行hg log -r release,但只会看到所选的检查点。您可以检查完整日志以查看所有操作是如何发生的。缺点:由于release分支取决于default,因此如果不将default带入其中,则无法将其推送到其他仓库。由于重复合并,hg glog -r release看起来也很奇怪。

解决方案3:如上所述使用命名分支,但使用rebase扩展名而不是合并。它可以选择复制而不是直接移动重新设定的变更集;它有一个选项--collapse,可以将一组修订转换为一个修订。每当您要完成一组修订r1:tip时,default复制到release,如下所示:

hg rebase --source r1 --dest release --keep --collapse

这推动了release头部的一个修订版,相当于从r1到default头部的整个变更集。 --keep选项使其成为副本,而不是破坏性重写。优点是release分支看起来就像你想要的那样:干净整洁,你可以在不拖动默认分支的情况下推送它。缺点是您无法将其阶段与default中的修订相关联,因此除非您确实 隐藏中间修订,否则我建议使用方法2。 (另外:在多个批次中压缩历史记录并不容易,因为rebase将移动/复制“源”修订版的所有后代。)

所有这些都需要你做一些额外的工作。这是不可避免的,因为mercurial无法知道你想要压制哪些革命。

答案 1 :(得分:3)

  

它应该让你过滤那段历史记录,以避免看到你可能想要压制的东西

Mercurial有这方面的工具。如果您不想看到(我在hg log中),请使用revsets过滤这些变更集:

hg log -r "not desc('autosave')"

或者如果你使用TortoiseHg,只需去查看 - >过滤工具栏,然后在工具栏中输入“not desc('autosave')”。瞧,自动保存条目隐藏在主列表中。

答案 2 :(得分:2)

如果您确实希望保留回购历史记录中每个Ctrl-S的所有细微更改,并且只有log显示重要历史记录的子集,那么您始终可以tag “重要”更改集,然后将别名log更改为log -r tagged()。或者您可以使用与其他revset descriptor相同的原则,例如在自动提交的消息中包含文本“autosave”并使用log -r keyword(autosave),这将显示所有非自动保存的提交。


为了实现您的目标,至少在我接近它时,我会在每次保存时使用mq extension并自动提交补丁队列存储库。然后,当你完成了“愚蠢的笨蛋”时,你可以hg qfinish将补丁作为可以推送的单一变更集。您应该(一如既往地!)将更改保持在一个概念或步骤的中心(例如“修复保存按钮”),但这将捕获到达目的地所需的所有小步骤。

你需要

  • hg qinit --mq一次初始化补丁队列​​仓库(fyi:存储在\.hg\patches\
  • hg qnew fixing-the-save-btn创建补丁

然后每次在IDE中保存

  • hg qrefresh更新补丁
  • hg commit --mq在补丁程序队列repo中创建小变更集

当你完成时

  • hg qfinish fixing-the-save-btn将补丁转换为要推送的变更集

这样可以让你的回复本地人与你每次保存时更改的内容保持一致,但只有在完成后才会推送变更集。您还可以qpopqpush更改您正在处理的项目。

如果您尝试使用压缩方法,那么当您压缩变更集时,您将失去笨拙的历史。无论是那个,或者你都被困在试图将工作迁移到'真实'存储库中,我可以从经验中告诉你,你不想这样做。 :)

答案 3 :(得分:1)

我建议你使用分支机构。当您启动新功能时,您将创建一个新分支。您可以在该分支中尽可能多地提交。完成后,将功能分支合并到主干中。通过这种方式,您基本上将历史分为两类:一类是细粒度(特征分支中的历史),另一类是粗粒度(树干中的历史)。您可以使用以下命令轻松查看其中任何一个:hg log --branch <branch-name>