You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何使用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.gifconfig.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

火山引擎 最新活动