为什么仓库会越来越大?

你有没有遇到过这样的情况:克隆一个Git仓库时,网速明明很快,但就是卡在“Receiving objects”这一步?或者每次提交代码都要等半天,因为仓库里藏着一些“巨无霸”文件?其实,Git仓库变大通常是因为这些原因:

  • 不小心提交了大文件:比如日志文件、安装包、视频/音频等二进制文件,或者开发工具生成的临时大文件。
  • 历史记录里的“陈年旧物”:有些大文件可能被多次提交到历史记录里,即使删除了本地的大文件,历史版本里的“幽灵”文件依然占用空间。
  • 子模块(Submodule)未优化:如果项目用了Git子模块,而子模块本身体积很大,也会导致整个仓库“虚胖”。

仓库太大的麻烦

  • 克隆/下载慢:别人克隆时要下载几十GB的历史数据,团队协作效率低。
  • 备份和传输费时间:每次备份仓库都要传大文件,占用存储空间。
  • 本地操作卡顿:Git操作(比如git loggit diff)会变慢,编辑器打开项目也会很卡。

一、先“斩草除根”:清理当前提交的大文件

如果最近一次提交刚把大文件加进去,还没推到远程仓库,直接删掉就好!

场景1:刚提交了大文件,还没推到远程

步骤
1. 确认大文件:用git status看看刚提交的文件,或者用ls -lh 文件名查看文件大小(比如ls -lh mybigfile.zip)。
2. 删除缓存区的大文件:假设大文件叫mybigfile.zip,执行:

   git rm --cached mybigfile.zip  # 只从Git缓存区删除,保留本地文件
  1. 重新提交:把修改后的内容提交:
   git commit -m "删除大文件mybigfile.zip"
  1. 推送更新:因为本地已经删掉了大文件,远程仓库还没变,直接推:
   git push

场景2:想删除历史中某一次提交里的大文件

如果大文件已经被多次提交到历史里(比如之前的5次提交都有这个大文件),需要清理历史记录。

二、“重写历史”:删除历史中的大文件

这里要用到一个工具:git filter-repo(比老工具git filter-branch更快、更安全,推荐用它)。

第一步:安装git filter-repo

  • Mac:用Homebrew安装:
  brew install git-filter-repo
  • Linux:用包管理器(Debian/Ubuntu):
  sudo apt-get install git-filter-repo
  • Windows:推荐用WSL(Windows Subsystem for Linux)或Chocolatey安装:
  choco install git-filter-repo  # 需要先装Chocolatey

第二步:删除历史中的大文件

假设大文件是mybigfile.zip,且它出现在所有历史提交中,执行:

# 进入仓库根目录,执行命令(替换路径和文件名)
git filter-repo --path mybigfile.zip

这条命令会遍历所有提交,把包含mybigfile.zip的文件从历史记录中彻底删除。

第三步:验证修改

执行git log --oneline查看历史提交,确认大文件已经消失。再用du -sh .git查看仓库大小,应该明显变小了。

第四步:推送到远程仓库

注意!本地修改了历史记录,远程仓库的历史没变,所以需要强制推送:

git push --force-with-lease origin main  # 把main分支的历史推到远程(origin是远程仓库名)

⚠️ 警告--force会覆盖远程仓库的历史,一定要确认团队成员没有基于旧历史工作!如果是多人协作,最好先沟通,或者在自己的个人仓库操作。

三、终极方案:清理所有大文件(包括子模块)

如果仓库里有多个大文件,或者想批量清理,可以用git filter-repo--path-glob参数匹配多个文件,比如删除所有.log文件:

git filter-repo --path-glob "*.log" --invert-paths  # --invert-paths表示删除匹配的文件

如果仓库用了Git子模块,子模块本身可能是个大文件,要先把子模块的大文件也清理掉,再git submodule update --init重新拉取。

四、避坑指南:操作前必看

  1. 备份仓库:操作前复制一份仓库到其他地方,防止意外。
  2. 别在多人分支用--force:如果是团队协作,--force会让别人的本地仓库出现冲突,最好等所有人确认后再执行。
  3. 检查是否漏删:清理后用git rev-list --objects --all | sort -k2n | tail -10列出最大的10个文件,看看是否还有遗漏。
  4. 别用git rm -rf删工作区git rm -rf会删除本地文件,而--cached只删缓存不删本地,更安全。

五、长期优化:用Git LFS管理大文件

如果项目必须提交大文件(比如视频、模型文件),别直接提交到Git!用Git LFS(Large File Storage) 替代:
1. 安装LFS:git lfs install
2. 跟踪大文件:git lfs track "*.zip"(跟踪所有.zip文件)
3. 提交.gitattributes文件:git add .gitattributes
4. 后续提交大文件会自动用LFS存储,节省仓库空间。

总结

清理Git仓库的核心思路是:删除无用大文件 + 重写历史记录。关键工具是git filter-repo,操作时记得备份和沟通。如果项目里有大文件,优先用Git LFS管理,从源头减少仓库体积!定期检查仓库大小,养成“小文件提交,大文件用LFS”的习惯,团队协作会更顺畅~

小夜