在团队开发中,经常遇到一个问题:本地修改完代码,准备推送到远程仓库时,Git 提示文件过大,被服务器拒绝。尤其是不小心把日志、缓存或者打包生成的 dist 文件夹整个提交了,很容易触发限制。GitHub 通常限制单个文件不超过 100MB,而有些公司内部 GitLab 甚至限制在 50MB 以内。
先确认是哪个文件太大
第一步不是急着删,而是查清楚谁“超重”了。可以运行下面这个命令找出大文件:
git rev-list --objects --all | sort -k 2 > allfile_git.txt
sort -n -r --key=2 allfile_git.txt | head -n 20
这个组合命令会列出历史提交中所有出现过的文件,并按大小排序,一眼就能看出哪些文件占空间最多。
从历史记录中彻底删除大文件
如果只是当前分支有大文件还没提交,直接删掉就好。但要是已经提交过,哪怕现在删了,Git 历史里还留着副本,依然会影响克隆和推送速度。这时候得用 git filter-branch 或更现代的 git-filter-repo 工具清理历史。
比如你想删除项目中的 logs/app.log,可以用:
git filter-branch --tree-filter 'rm -f logs/app.log' HEAD
不过更推荐使用 git-filter-repo(需提前安装),它更快更安全:
git-filter-repo --path logs/app.log --invert-paths
执行后,该文件会从所有历史提交中移除,再重新打包,体积就降下来了。
用 .gitignore 防患未然
很多问题其实是重复踩坑。比如每次打包都生成 dist/、node_modules/ 或 .log 文件,如果不加忽略,迟早又出事。在项目根目录的 .gitignore 里加上这些规则:
# 忽略构建产物
/dist
/build
/out
# 忽略依赖包
/node_modules
# 忽略日志
*.log
logs/
# 忽略环境变量文件
.env
.env.local
这样就算手滑提交,Git 也会自动跳过它们。
拆分大提交为小批次
有时候不是单个文件大,而是一次性改了太多内容,导致整体提交数据量超标。这种情况可以把改动拆开,分批提交推送:
git add src/module-a
git commit -m "feat: 更新模块 A"
git push
git add src/module-b
git commit -m "feat: 更新模块 B"
git push
既能避免超限,也方便队友 review。
使用 Git LFS 管理大文件
有些项目确实需要版本控制大文件,比如游戏资源、设计稿或机器学习模型。这时候别硬塞进 Git,用 Git LFS(Large File Storage)才是正解。
先安装 Git LFS,然后跟踪你想要管理的类型:
git lfs install
git lfs track "*.psd"
git lfs track "models/*.bin"
提交时,LFS 会自动把大文件替换为指针,真实内容存在专用服务器上,不再拖累主仓库。
压缩后再考虑是否提交
偶尔需要传一个配置用的数据文件,比如几 MB 的 JSON 或 CSV。这类文件建议先压缩或转成二进制格式,比如用 gzip 或转换为 msgpack,减少体积。或者干脆放到外部存储,只在代码里留下载链接。
定期清理本地和远程分支
很多人只关注当前工作区,忽略了旧分支堆积也会让仓库越来越臃肿。定期清理已合并的分支能有效瘦身:
# 删除本地已合并的分支
git branch --merged | grep -v '\*\|main\|master' | xargs -n 1 git branch -d
# 删除远程对应分支
git push origin --delete $(git branch -r --merged | grep origin | grep -v 'main\|master' | sed 's/origin\///')