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工具,比直接修改历史更安全:
先做备份!先做备份!先做备份!
操作前一定要克隆一份原仓库作为备份,防止操作失误丢失数据:hg clone your-local-repo backup-repo创建文件过滤规则
新建一个filemap.txt文件,把要移除的大文件都列进去,格式如下:exclude path/to/big-file-1.iso exclude path/to/big-file-2.zip # 也可以用通配符排除某类文件,比如所有ISO镜像 exclude glob:**/*.iso注意路径要和仓库里的实际路径一致。
生成清理后的新仓库
运行hg convert命令,用过滤规则创建一个干净的新仓库:hg convert --filemap filemap.txt your-local-repo cleaned-repo这个命令会重新生成仓库历史,所有被排除的文件都会从历史中彻底消失。
验证新仓库体积
检查新仓库的大小,确认已经降到正常范围:du -sh cleaned-repo替换远程仓库(Bitbucket)
先和团队成员沟通好,因为修改历史后,旧的本地仓库会和远程仓库冲突。然后推送清理后的仓库到Bitbucket,需要强制推送:cd cleaned-repo hg push --force your-bitbucket-repo-url通知团队重新克隆
让所有团队成员删除旧的本地仓库,重新克隆Bitbucket上的新仓库,避免后续推送冲突。
注意事项
- 修改仓库历史是破坏性操作,一定要提前和团队同步计划,避免有人在旧仓库上做了未提交的修改。
- 如果你的Mercurial没启用
convert扩展,需要在~/.hgrc(或Mercurial.ini)里添加:[extensions] convert = - 若仓库有多个分支,
hg convert会自动处理所有分支,但建议在新仓库里用hg branches检查一下,确保所有分支都正常迁移。
内容的提问来源于stack exchange,提问作者Ladefuss

