如何使用git-filter-repo清理Git仓库历史以缩减.git文件体积
如何使用git-filter-repo清理Git仓库历史以缩减.git文件体积
看来你的仓库因为误提交的大体积TIFF文件,还有不少GIF、JSON、CSV、TSV文件导致.git文件夹膨胀了,别担心,用git-filter-repo可以精准清理历史,把仓库体积瘦下来。咱们一步步来:
第一步:先做仓库备份!
这步绝对不能省!毕竟修改历史是不可逆操作,万一哪里弄错了,备份能帮你找回数据。你可以:
- 直接复制整个仓库文件夹到其他位置;
- 或者用镜像克隆做备份:
git clone --mirror <你的仓库地址> backup-repo.git
第二步:删除data/fov文件夹的所有历史记录
既然这个文件夹是TIFF文件的存放地,而且已经不存在了,咱们直接把它从所有历史提交里彻底删掉:
git filter-repo --path data/fov --invert-paths
这个命令会遍历所有提交,移除任何包含data/fov文件夹的内容,相当于让这个文件夹从未出现在仓库历史里。
第三步:选择性移除大部分GIF、JSON、CSV、TSV文件
你说要保留部分这些格式的文件,这里分两种常见场景来处理:
场景1:保留特定目录下的目标格式文件
比如你想保留core_files/目录下的所有GIF、JSON、CSV、TSV,删除其他地方的这些文件,可以用组合过滤:
git filter-repo \ # 删除所有.gif文件,然后保留core_files下的.gif --path-glob '*.gif' --invert-paths \ --path 'core_files/*.gif' \ # 对.json做同样操作 --path-glob '*.json' --invert-paths \ --path 'core_files/*.json' \ # 对.csv做同样操作 --path-glob '*.csv' --invert-paths \ --path 'core_files/*.csv' \ # 对.tsv做同样操作 --path-glob '*.tsv' --invert-paths \ --path 'core_files/*.tsv'
原理是先全局移除某格式的所有文件,再把你想保留的特定目录下的文件加回来。
场景2:保留特定文件名的目标格式文件
如果是要保留几个关键文件(比如user_profile.gif、config.json),删除其他同格式文件,就用:
git filter-repo \ # 删除所有.gif,保留指定的user_profile.gif --path-glob '*.gif' --invert-paths \ --path 'user_profile.gif' \ # 删除所有.json,保留指定的config.json --path-glob '*.json' --invert-paths \ --path 'config.json' \ # 删除所有.csv,保留指定的monthly_report.csv --path-glob '*.csv' --invert-paths \ --path 'monthly_report.csv' \ # 删除所有.tsv,保留指定的summary.tsv --path-glob '*.tsv' --invert-paths \ --path 'summary.tsv'
你可以根据自己的实际需求,调整--path后面的文件名或路径。
第四步:彻底清理仓库垃圾,压缩体积
执行完上面的过滤后,仓库里还残留着一些废弃的历史对象,咱们把它们彻底清理掉并压缩:
git reflog expire --expire=now --all && git gc --prune=now --aggressive
这个命令会清理所有过期的引用,并用激进模式压缩仓库,进一步减小.git文件夹的大小。
第五步:推送到远程仓库(如果需要)
因为你修改了仓库的历史记录,所以推送的时候需要强制覆盖远程分支:
git push origin --force --all
⚠️ 注意:如果团队里还有其他人在使用这个仓库,一定要提前告诉他们!他们需要重新克隆仓库,或者执行git pull --rebase来同步修改,否则会出现历史冲突。
一些额外提醒
- 确保你的环境里安装了Python3,因为
git-filter-repo是基于Python3的工具; - 如果之前用过
git filter-branch,建议先清理相关的缓存和痕迹,避免影响git-filter-repo的执行; - 如果你的仓库是fork来的,修改历史后可能会影响和上游仓库的同步,操作前要谨慎评估。
备注:内容来源于stack exchange,提问作者Aenaon




