近乎空的Git仓库.git文件夹体积过大问题排查与解决
问题原因
你的仓库回滚到初始提交后,.git文件夹依然庞大的核心原因是:Git会永久保留所有历史提交的对象数据。之前提交过的大文件(比如Pods依赖、编译产物、大型资源等)虽然从当前分支的工作区消失了,但它们仍然存在于Git的对象数据库(.git/objects目录)中。Bitbucket的仓库容量统计包含整个Git仓库的所有历史对象,所以仅仅重置分支HEAD不会清理这些历史遗留的大对象,导致.git文件夹依然占绝大多数体积。
解决步骤
1. 定位历史中的大文件
先找出仓库里占据空间最大的历史文件,执行以下命令:
# 列出仓库中体积最大的20个对象及其对应文件路径 git rev-list --all --objects | grep -E "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -20 | awk '{print$1}')"
执行后会输出大文件的历史路径,比如Pods/目录或者单个大资源文件。
2. 彻底移除历史中的大文件
使用git filter-repo工具(比旧的git filter-branch更安全高效)彻底从所有历史提交中删除目标大文件:
- 如果要删除整个
Pods/目录:
git filter-repo --path Pods/ --invert-paths
- 如果要删除单个大文件(比如
LargeAsset.dmg):
git filter-repo --path LargeAsset.dmg --invert-paths
注意:如果本地没有
git filter-repo,macOS可以通过brew install git-filter-repo安装,其他系统可通过对应包管理器或官方文档安装。
3. 清理本地Git缓存
执行以下命令彻底清理未被引用的历史对象,缩小.git文件夹:
git reflog expire --expire=now --all && git gc --prune=now --aggressive
4. 强制推送到远程仓库
Bitbucket默认可能禁止强制推送,需要先临时开启权限:
- 登录Bitbucket仓库后台,进入「Settings」→「Branch permissions」
- 找到当前主分支(比如
main或master),临时允许「Force push」权限 - 执行强制推送:
git push --force origin main # 替换为你的分支名
- 推送完成后,记得关闭分支的强制推送权限,避免误操作。
注意事项
- 操作前务必备份本地仓库(复制整个仓库文件夹),防止数据丢失。
- 如果有其他协作者,他们需要重新克隆仓库,因为仓库历史已被改写,本地旧仓库无法正常拉取更新。
内容的提问来源于stack exchange,提问作者Gargo
相关产品推荐
相关产品推荐

