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

目录

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

2、找出历史里的大文件

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

[4、已经进多次历史,用 filter-repo 清掉](#4、已经进多次历史,用 filter-repo 清掉)

5、大文件以后放哪里


最近提交代码时,Gitee 把 push 拦下来了。

原因很直接:有个大文件超过限制,提示大概是 100MB 这一类。

我一开始以为很简单:把文件删掉,再提交一次。

结果还是失败。

后来才反应过来,Git 不是只看当前目录。这个大文件只要曾经被 commit 过,即使后来删了,它还在 Git 历史里。Gitee 检查到历史对象里有超限文件,照样拒绝。

嵌入式项目很容易踩这个坑。

固件包、binhexelfmap、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.elfrelease/xxx.zipxxx.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 就自动消失。该清历史还是要清。