超过100MB的大文件Gitee提交失败,怎么解决?

2026-10-19 15:25:22 6阅读

最近提交代码时,Gitee 把 push 拦下来了。原因很直接:有个大文件超过限制,提示大概是 100MB 这一类。

我一开始以为很简单:把文件删掉,再提交一次。结果还是失败。后来才反应过来,Git 不是只看当前目录。这个大文件只要曾经被 commit 过,即使后来删了,它还在 Git 历史里。Gitee 检查到历史对象里有超限文件,照样拒绝。

嵌入式项目很容易踩这个坑。固件包、bin、hex、elf、map、SDK 压缩包、抓包日志、客户现场日志,一次 git add . 就可能混进去。

一、先判断文件有没有进历史

如果只是暂存,还没提交:

git restore --staged path/to/big-file.bin

然后加到 .gitignore:

build/
output/
*.bin
*.hex
*.elf
*.map
*.zip
*.7z
*.log
*.pcap

如果已经 commit 过,就不是删文件这么简单了。

二、找出历史里的大文件

Git Bash 可以用:

git rev-list --objects --all |
git cat-file --batch-check="%(objecttype) %(objectname) %(objectsize) %(rest)" |
grep "^blob" |
sort -k3 -n |
tail -20

PowerShell 可以用:

git rev-list --objects --all |
  git cat-file --batch-check="%(objecttype) %(objectname) %(objectsize) %(rest)" |
  Select-String "^blob" |
  Sort-Object { [int64](($_ -split "\s+")[2]) } |
  Select-Object -Last 20

看见 build/xxx.elf、release/xxx.zip、xxx.bin 这类路径,就基本知道问题在哪了。

三、只在最后一次提交里,直接改最后一次提交

如果大文件只在最后一次 commit 里:

git rm --cached path/to/big-file.bin
git add .gitignore
git commit --amend
git push

--cached 表示只从 Git 里移除,本地文件还在。

四、已经进多次历史,用 filter-repo 清掉

安装:

pip install git-filter-repo

清理指定文件:

git filter-repo --path path/to/big-file.bin --invert-paths

清理整个构建目录:

git filter-repo --path build/ --invert-paths

清理本地对象:

git gc --prune=now --aggressive

推送:

git push --force-with-lease origin main

如果是团队仓库,先通知大家暂停提交。改写历史后,最好让成员重新克隆,别各自乱 rebase。

五、大文件以后放哪里

文件建议位置
固件发布包Gitee Release 或制品库
编译生成的 bin/hex/elfCI 产物
SDK 压缩包文件服务器,文档写版本和哈希
抓包、日志、波形问题单附件或日志服务器
必须版本化的大资源Git LFS

Git LFS 可以用,但不是万能药。已经进普通 Git 历史的大文件,不会因为执行 git lfs track 就自动消失,该清历史还是要清。


作者:不脱发的程序猿
链接:https://www.aiddithome.com/p/9f38f690f28c5.html
本作遵循 [CC BY 4.0 署名] 许可,版权归作者所有。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论
阿伟不emo
1楼 · 2天前

原来大文件一进Git历史就不好清了,涨知识了,以后 build 目录一定记得提前 gitignore

老张装机
2楼 · 2天前

遇到过,push老是失败,现在知道是历史里有大对象,得用 filter-repo 清

触底反弹的Tony
3楼 · 2天前

LFS也是被坑过之后才懂的,这篇讲得实在

阿伟不emo
4楼 · 2天前

原来大文件一进Git历史就不好清了,涨知识了,以后 build 目录一定记得提前 gitignore