目录
[4、已经进多次历史,用 filter-repo 清掉](#4、已经进多次历史,用 filter-repo 清掉)
最近提交代码时,Gitee 把 push 拦下来了。
原因很直接:有个大文件超过限制,提示大概是 100MB 这一类。
我一开始以为很简单:把文件删掉,再提交一次。
结果还是失败。
后来才反应过来,Git 不是只看当前目录。这个大文件只要曾经被 commit 过,即使后来删了,它还在 Git 历史里。Gitee 检查到历史对象里有超限文件,照样拒绝。
嵌入式项目很容易踩这个坑。
固件包、bin、hex、elf、map、SDK 压缩包、抓包日志、客户现场日志,一次 git add . 就可能混进去。
1、先判断文件有没有进历史
如果只是暂存,还没提交:
git restore --staged path/to/big-file.bin
然后加到 .gitignore:
build/
output/
*.bin
*.hex
*.elf
*.map
*.zip
*.7z
*.log
*.pcap
如果已经 commit 过,就不是删文件这么简单了。

2、找出历史里的大文件
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 这类路径,就基本知道问题在哪了。
3、只在最后一次提交里,直接改最后一次提交
如果大文件只在最后一次 commit 里:
git rm --cached path/to/big-file.bin
git add .gitignore
git commit --amend
git push
--cached 表示只从 Git 里移除,本地文件还在。
4、已经进多次历史,用 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
清理本地对象:
cpp
git gc --prune=now --aggressive
推送:
cpp
git push --force-with-lease origin main
如果是团队仓库,先通知大家暂停提交。改写历史后,最好让成员重新克隆,别各自乱 rebase。
5、大文件以后放哪里
不要把 Git 当网盘。
| 文件 | 建议位置 |
|---|---|
| 固件发布包 | Gitee Release 或制品库 |
编译生成的 bin/hex/elf |
CI 产物 |
| SDK 压缩包 | 文件服务器,文档写版本和哈希 |
| 抓包、日志、波形 | 问题单附件或日志服务器 |
| 必须版本化的大资源 | Git LFS |
Git LFS 可以用,但不是万能药。
已经进普通 Git 历史的大文件,不会因为你执行 git lfs track 就自动消失。该清历史还是要清。