喵♂呜 的博客

一个刚毕业就当爹的程序猿 正在迷雾中寻找道路...

如何在Git历史中清理一个文件

近期发布项目的时候发现有一个证书不小心被提交到 git 仓库里了 现在需要清理掉 同时要保留以前的分支记录

git filter-branch

使用 git filter-branch 可以批量操作所有的分支历史

指令

1
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 需要清理的文件' --prune-empty --tag-name-filter cat -- --all
1
2
3
4
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
1
2
git push origin --force --all
git push origin --force --tags

参数选项

  • --tree-filter 表示修改文件列表
  • --msg-filter 表示修改提交信息
  • --prune-empty 表示清理空提交
  • -f 是忽略备份

使用技巧

  • 批量删除文件 git filter-branch --index-filter 'git rm --cached --ignore-unmatch <your-file-name>'

  • Gitlab提供的命令 git filter-branch --force --tree-filter 'git rm -f <your-file-name>' HEAD

  • 删除原始引用 rm -rf .git/refs/original/

  • 清理本地缓存 git reflog expire --expire=now --all && git gc --prune=now --aggressive

  • 重新打包 git repack -A -d

  • 查找历史大文件 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

欢迎关注我的其它发布渠道