使用Bfg-repo-cleaner清理Bitbucket Server仓库成功,但克隆仍显示原大小
解决Bitbucket Server仓库清理后克隆仍为原大小的问题
我之前也碰到过一模一样的情况——用BFG把本地仓库清理到125MB,push成功后远程提交ID也更新了,但新克隆下来的仓库还是原来的700多MB。这主要是因为Bitbucket Server还留着旧Git对象的缓存,或者我们没彻底推送所有清理后的分支/标签,下面一步步来解决:
1. 确保本地清理彻底,强制推送所有分支和标签
BFG默认处理所有分支,但如果有未推送的标签、冷门分支,远程仓库里还会残留旧历史对象:
- 先在本地把所有分支都过一遍,确保都完成清理:
git branch -a | grep -v HEAD | grep -v master | xargs git checkout git reflog expire --expire=now --all git gc --prune=now --aggressive - 接着强制推送所有分支和标签到远程,覆盖旧历史:
git push --force --all git push --force --tags提醒:强制推送会覆盖远程分支历史,一定要提前和团队成员同步,避免有人的本地代码和远程冲突。
2. 在Bitbucket Server手动触发Git垃圾回收
Bitbucket不会自动立刻清理未被引用的旧对象,需要手动触发仓库维护:
- 登录Bitbucket Server进入你的仓库页面
- 点击顶部的Settings(设置)标签
- 左侧菜单找到Maintenance(维护)选项
- 点击Start Git garbage collection(启动Git垃圾回收)按钮,等待执行完成
这个过程可能需要几分钟,完成后Bitbucket会彻底删除所有没用的旧对象
3. 删除远程残留的旧备份引用(如果存在)
BFG清理时会创建refs/original/开头的引用用来备份旧历史,如果这些引用被推到了远程,会一直“占着”旧对象:
- 先检查远程有没有这类引用:
git ls-remote --refs origin refs/original/ - 如果有输出,执行命令删除远程的这些引用(替换master为对应分支名):
git push origin :refs/original/refs/heads/master
4. 验证并重新克隆
完成以上步骤后,等个几分钟让Bitbucket同步数据,再重新克隆仓库:
git clone <你的仓库URL>
这次克隆下来的仓库大小应该就和你本地清理后的125MB一致了。另外注意,Bitbucket页面上显示的仓库总大小可能有延迟,即使实际对象已经清理,页面数值可能需要刷新几次才会更新,但本地克隆的大小是准确的。
内容的提问来源于stack exchange,提问作者Vibhuti
相关产品推荐
相关产品推荐

