我不小心提交了一些大文件(300MB)。然后我做了其他提交,意识到大文件不应该进入存储库,所以我删除了它们。
但是,在推送时,mercurial 会尝试按时间顺序发送变更集,这意味着它首先会尝试推送大文件。等待2小时后没有成功。那么,我可以在不影响其余部分的情况下摆脱那个特定的提交(变更集)吗?
或者我应该删除整个项目,提取一个新副本并手动重新应用我的其他更改?
我不小心提交了一些大文件(300MB)。然后我做了其他提交,意识到大文件不应该进入存储库,所以我删除了它们。
但是,在推送时,mercurial 会尝试按时间顺序发送变更集,这意味着它首先会尝试推送大文件。等待2小时后没有成功。那么,我可以在不影响其余部分的情况下摆脱那个特定的提交(变更集)吗?
或者我应该删除整个项目,提取一个新副本并手动重新应用我的其他更改?
我通常发现rebase
和strip
命令对于这种历史修改操作是非常有用的工具;您可以将错误提交后所做的所有更改重新设置在其父级之上,然后剥离错误的变更集。
说<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
如您所见,坏的变更集现在已经消失了。
请注意,为了rebase
和strip
工作,您需要启用rebase
和mq
扩展。还要确保在执行此历史修改操作之前制作存储库的备份副本。
只要推送没有完成,您可以尝试启用“mq”扩展,您可以删除尚未推送的提交。
您不必完全手动重新应用其他更改。您可以export
将import
它们添加到新的存储库副本中。