Git仓库瘦身:应在克隆副本还是托管裸仓库执行git filter-repo?
移除Bonobo自托管Git仓库大文件历史的实操方案
操作路径选择
绝对不要直接操作Bonobo托管的裸仓库,原因有二:一是git filter-repo对裸仓库的支持不完善,容易出现不可预期的错误;二是直接修改生产仓库风险极高,即便有备份,恢复和排查问题的成本也远高于本地操作。正确的做法是在本地克隆的完整镜像副本上执行清理。
本地清理后同步到Bonobo的步骤
- 克隆带全量历史的镜像仓库:
这个镜像副本包含所有分支、标签的完整历史,是最适合做历史改写的载体。git clone --mirror <你的Bonobo仓库地址> - 执行大文件清理:
在克隆的镜像仓库目录下运行:
如果需要精准清理特定类型/路径的文件,可以追加参数,比如排除所有git filter-repo --strip-blobs-bigger-than 4M.zip文件:git filter-repo --path "*.zip" --invert-paths - 强制推送改写后的历史到Bonobo:
因为彻底改写了仓库历史,必须用强制推送覆盖远程仓库:git push --force --all git push --force --tags - 通知团队成员同步:
所有团队成员的本地旧仓库无法通过常规拉取同步改写后的历史,必须删除旧本地仓库,重新克隆Bonobo上的新仓库。
.gitignore相关问题说明
你提到的“已加入.gitignore但修改仍被识别为变更”,是因为这些文件已经被提交到历史中了。gitignore只对未被追踪的文件生效,对已经提交过的文件无效。等git filter-repo完成清理后,新的仓库历史里不再包含这些大文件,之后如果有新的同类型文件,只要.gitignore规则正确,就不会被自动追踪。
内容的提问来源于stack exchange,提问作者Csaba Toth
相关产品推荐
相关产品推荐

