如何在TortoiseHG(Mercurial)中撤销指定提交的单个大文件并保留后续提交
解决TortoiseHG大文件提交无法推送的问题
方案一:重写历史移除大文件(推荐)
这个方法会修改Rev50的提交,移除大文件后重新应用后续所有提交,保留修改内容的同时清理掉大文件记录:
启用histedit扩展
打开TortoiseHG的「设置」,找到「扩展」选项卡,勾选histedit;如果用命令行,在仓库的.hg/hgrc文件中添加:[extensions] histedit=启动历史编辑
- 图形化操作:在TortoiseHG的历史视图中,右键点击Rev49(Rev50的父提交),选择「历史编辑」
- 命令行:执行
hg histedit -r 49
修改Rev50提交
在弹出的histedit编辑界面中,找到Rev50的条目,将操作从pick改为edit,保存并执行。此时仓库会回退到Rev50提交前的状态。移除大文件并修正提交
删除那个1GB的大文件,然后在TortoiseHG中选择「修正提交」(命令行:hg commit --amend),保持原提交信息不变,完成Rev50的修改。完成历史重写
继续执行histedit的后续步骤,工具会自动将Rev51到63的所有提交重新应用到修改后的Rev50上,生成一套无大文件的新历史。强制推送到远程
因为历史被修改,需要强制推送覆盖远程仓库:- 图形化:在推送界面勾选「强制推送」选项
- 命令行:执行
hg push --force
注意:如果团队中有人已经拉取过旧的Rev50到63提交,必须通知他们丢弃本地旧历史,重新克隆远程仓库,或者将本地修改cherry-pick到新历史上,避免冲突。
方案二:临时分支绕过(适合不想重写历史的场景)
如果不想修改原有历史,可以创建一个干净的新分支,复制所有有效修改:
创建新分支并回退到Rev49
- 图形化:在历史视图中右键点击Rev49,选择「更新到此处」,然后点击「分支」按钮创建新分支(比如命名为
clean-history) - 命令行:执行
hg branch clean-history && hg update 49
- 图形化:在历史视图中右键点击Rev49,选择「更新到此处」,然后点击「分支」按钮创建新分支(比如命名为
逐个应用后续提交的修改
对Rev50到63的每个提交,导出补丁并导入到新分支:- 导出补丁:
hg export -r 50 > patch50.patch(依次处理到63) - 导入补丁:
hg import patch50.patch,导入时跳过大文件的添加操作(如果补丁里有大文件的add命令,手动编辑补丁删除该行)
- 导出补丁:
推送新分支到远程
完成所有补丁导入后,将新分支推送到远程,之后团队成员切换到这个新分支工作,旧分支废弃。
关键注意事项
- 无论用哪种方法,都要确保远程仓库的旧历史被完全覆盖,避免推送时仍触发大文件的上传
- 临时方案可以支撑到公司切换到SVN,迁移时直接用清理后的历史即可
内容的提问来源于stack exchange,提问作者norand
相关产品推荐
相关产品推荐

