使用BFG Repo-Cleaner清理Git仓库后推送仍体积过大问题
解决BFG清理Git仓库后远程体积未缩减的问题
我帮你分析下这个问题,核心原因和GitHub的Pull Request(PR)引用机制有关,咱们一步步拆解解决:
问题根源
你遇到的两个关键问题:
refs/pull/*是GitHub只读隐藏引用:这些引用是GitHub自动为PR生成的,用来跟踪PR的状态,你没有权限修改或推送它们,所以推送时的deny updating a hidden ref提示是正常的,但这些引用还指向未被清理的旧大提交,导致远程仓库的冗余对象没被删除。- GitHub不会立即清理旧对象:就算你推送了清理后的分支,GitHub需要等待自动垃圾回收(GC)运行,才会删除没有任何引用指向的旧对象。
解决步骤
1. 强制推送清理后的核心分支
首先得把你本地清理好的分支(比如main/master、开发分支等)强制推送到远程——因为历史被改写了,普通推送会失败,必须用强制推送:
cd FourierFlows.jl.git # 推送所有分支(提醒下:这么做要确保团队所有人都知道仓库历史被改写了,得重新克隆) git push --force --all # 如果有标签也需要更新,同样强制推送 git push --force --tags
推送时出现的refs/pull相关拒绝提示直接忽略就行,这些引用咱们根本改不了。
2. 移除远程不必要的旧引用(可选)
如果远程还有没用的旧分支、旧标签,也一起删掉,避免它们继续“挂着”旧的大对象:
# 删除远程旧分支示例 git push origin --delete old-branch-name # 删除远程旧标签示例 git push origin --delete tag/v1.0.0
3. 等待GitHub自动垃圾回收
GitHub会定期自动运行GC,一般1-3天就会清理掉那些没有任何引用指向的旧对象。要是你着急,也可以联系GitHub支持请求手动触发,但大部分情况下等自动清理就够了。
4. 验证清理效果
等GC完成后,再克隆镜像仓库试试,体积应该就降到你本地的大小了:
git clone --mirror https://github.com/FourierFlows/FourierFlows.jl.git
重要提醒
- 仓库历史被改写后,所有团队成员都得重新克隆仓库,不能再用之前的本地仓库干活,不然会出现严重的历史冲突。
refs/pull引用是GitHub的内部机制,不用手动处理,等PR关闭或合并一段时间后,GitHub会自动清理相关的旧对象。
内容的提问来源于stack exchange,提问作者navidcy
相关产品推荐
相关产品推荐

