You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从Git版本库彻底移除已删大文件以完成GitHub推送?

解决GitHub推送时GH001大文件检测错误的方案

我明白你现在的困扰——明明已经删掉了那个大Pod文件,怎么推送还是报GH001错误?其实问题出在Git的提交历史里,那个300多MB的文件已经存在于之前的提交记录中了,GitHub的检测会扫描整个历史,所以光删当前文件、修改最近一次提交都没用。下面给你一套可靠的解决方案:

1. 用git filter-repo彻底清除历史中的大文件

Git官方现在推荐用git filter-repo替代老旧的git filter-branch,它更稳定且不易出错。

  • 首先确认你安装了git filter-repo

    • macOS用户可以通过Homebrew安装:brew install git-filter-repo
    • 其他系统可通过对应包管理工具完成安装
  • 执行清理命令,把历史中所有包含目标大文件的提交都移除:

    git filter-repo --path Pods/FirebaseMLVisionTextModel/Frameworks/FirebaseMLVisionTextModel.framework/FirebaseMLVisionTextModel --invert-paths
    

    这个命令会遍历整个Git提交历史,删除所有涉及该文件的记录,彻底从仓库中清除它的痕迹。

2. 强制推送到远程仓库

因为我们修改了Git的提交历史,所以需要强制覆盖远程仓库的历史记录:

git push origin master --force

⚠️ 注意:如果有其他开发者也在这个master分支上协作,一定要提前和他们沟通!强制推送会覆盖远程分支的现有历史,他们需要重新拉取并同步本地仓库。

3. 后续预防措施

为了避免以后再遇到类似问题:

  • Pods目录添加到.gitignore文件中,这样Git就不会追踪Pod相关的文件了:
    在项目根目录的.gitignore里添加一行:Pods/
  • 如果之后确实需要提交大文件,考虑使用Git LFS(大文件存储)来管理,不过这次我们的目标是彻底移除,所以这步可选。

备选方案(如果git filter-repo无法使用)

如果你的Git版本太老,无法使用git filter-repo,可以试试BFG Repo-Cleaner工具:

  1. 下载BFG的jar文件
  2. 执行命令清除大文件:
    java -jar bfg.jar --delete-files FirebaseMLVisionTextModel
    
  3. 然后执行git reflog expire --expire=now --all && git gc --prune=now --aggressive来清理Git的垃圾数据
  4. 最后同样强制推送到远程:git push origin master --force

这样操作后,那个大文件就会彻底从你的Git仓库历史中消失,再推送就能成功啦!

内容的提问来源于stack exchange,提问作者Nikita Goncharov

火山引擎 最新活动