You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mercurial技术问题:查找并移除仓库历史中的大文件提交

解决Mercurial仓库体积过大的问题:定位并移除历史中的大文件

嘿,我来帮你搞定这个Mercurial仓库膨胀的麻烦!下面是一步步的实操方案,都是团队里踩过坑后总结的有效方法:

第一步:定位添加大文件的修订版本

首先得找出到底是哪个提交塞了大文件,有几个实用的方法:

方法1:用内置命令排查大文件

直接列出历史中所有文件的大小并排序,快速定位最大的那些:

hg files -r "all()" --size | sort -n -k 2

找到大文件后,用下面的命令查看它是哪个提交添加的:

hg log -f path/to/your-big-file.ext

输出里的第一个提交就是添加这个文件的版本。

方法2:用hg bigfiles工具(更高效)

如果你的Mercurial没装这个扩展,先通过pip安装:

pip install hg-bigfiles

然后直接运行命令,它会自动列出仓库里的大文件以及对应的提交信息:

hg bigfiles

这个工具会帮你省掉手动排序的步骤,直接高亮显示大文件和关联的修订版。

方法3:遍历所有添加文件的提交

如果不确定文件类型,也可以只看所有添加了新文件的提交,缩小排查范围:

hg log -r "added()" --template "{rev}: {author} - {desc}\n{files}\n\n"

从输出里找那些包含大文件名称的提交。

第二步:移除历史中的大文件并清理仓库

找到问题提交后,接下来要修改仓库历史,彻底移除这些大文件。这里推荐用hg convert工具,比直接修改历史更安全:

  1. 先做备份!先做备份!先做备份!
    操作前一定要克隆一份原仓库作为备份,防止操作失误丢失数据:

    hg clone your-local-repo backup-repo
    
  2. 创建文件过滤规则
    新建一个filemap.txt文件,把要移除的大文件都列进去,格式如下:

    exclude path/to/big-file-1.iso
    exclude path/to/big-file-2.zip
    # 也可以用通配符排除某类文件,比如所有ISO镜像
    exclude glob:**/*.iso
    

    注意路径要和仓库里的实际路径一致。

  3. 生成清理后的新仓库
    运行hg convert命令,用过滤规则创建一个干净的新仓库:

    hg convert --filemap filemap.txt your-local-repo cleaned-repo
    

    这个命令会重新生成仓库历史,所有被排除的文件都会从历史中彻底消失。

  4. 验证新仓库体积
    检查新仓库的大小,确认已经降到正常范围:

    du -sh cleaned-repo
    
  5. 替换远程仓库(Bitbucket)
    先和团队成员沟通好,因为修改历史后,旧的本地仓库会和远程仓库冲突。然后推送清理后的仓库到Bitbucket,需要强制推送:

    cd cleaned-repo
    hg push --force your-bitbucket-repo-url
    
  6. 通知团队重新克隆
    让所有团队成员删除旧的本地仓库,重新克隆Bitbucket上的新仓库,避免后续推送冲突。

注意事项

  • 修改仓库历史是破坏性操作,一定要提前和团队同步计划,避免有人在旧仓库上做了未提交的修改。
  • 如果你的Mercurial没启用convert扩展,需要在~/.hgrc(或Mercurial.ini)里添加:
    [extensions]
    convert =
    
  • 若仓库有多个分支,hg convert会自动处理所有分支,但建议在新仓库里用hg branches检查一下,确保所有分支都正常迁移。

内容的提问来源于stack exchange,提问作者Ladefuss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:08:51