如何不推送给定的提交

时间:2012-11-13 16:00:53

标签: mercurial

我不小心犯了一些大文件(300MB)。然后我做了其他提交,并意识到巨大的文件不应该进入存储库,所以我删除了它们。

然而,当推送时,mercurial尝试按时间顺序发送变更集,这意味着它首先尝试推送巨大的文件。经过2个小时的等待后没有成功。那么,我可以摆脱那个特定的提交(变更集)而不影响其余的吗?

或者我应该删除整个项目,提取新副本并手动重新应用其他更改?

3 个答案:

答案 0 :(得分:2)

我经常发现rebasestrip命令对于这种历史修改操作是非常有用的工具;您可以在其父项之上修改在错误提交之后所做的所有更改,然后删除错误的更改集。

<bad>是您要删除的错误更改集,<parent>是其父级,<child>是您要保留的子级:

hg rebase -s <child> -d <parent>
hg strip <bad>

示例:

$ hg log -G
@  changeset:   2:6d0685591967
|  summary:     after
|
o  changeset:   1:fab6b3f4effa
|  summary:     bad
|
o  changeset:   0:0233d1f3547c
   summary:     before

$ hg rebase -s 2 -d 0
saved backup bundle to .hg/strip-backup/6d0685591967-backup.hg
$ hg log -G
@  changeset:   2:b0fa9ee8533f
|  parent:      0:0233d1f3547c
|  summary:     after
|
| o  changeset:   1:fab6b3f4effa
|/   summary:     bad
|
o  changeset:   0:0233d1f3547c
   summary:     before

$ hg strip 1
saved backup bundle to .hg/strip-backup/fab6b3f4effa-backup.hg
$ hg log -G
@  changeset:   1:b0fa9ee8533f
|  summary:     after
|
o  changeset:   0:0233d1f3547c
   summary:     before

正如你所看到的,糟糕的变化集已经消失了。

请注意,要使rebasestrip生效,您需要启用rebasemq扩展程序。在执行此历史记录修改操作之前,请务必制作存储库的备份副本。

答案 1 :(得分:1)

只要推送没有完成,您就可以尝试启用“mq”扩展名,并且可以删除尚未推送的提交。

答案 2 :(得分:1)

您不必完全手动重新应用其他更改。您可以export他们,然后import他们到您的新存储库副本。