git操作-删除.git里提交的大文件
有时我们的gitignore没有配置,导致一些大文件被误提交上去~
1. 先找到大文件(如果你已经知道是哪个文件以及该文件的路径,可直接进行第二步)
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5
这行命令是找到排名前5的大文件存在的git记录,从小到大排列。一般最后一个最大的可能就是我们的大文件提交记录。
918f1535244c0d22b45f24abfafa3f2560623f64 blob 157684 20766 3891954 1abd344e1dfaec710490947cdab7fd73f99f6baf blob 190633 65825 5005204 1 c5f2c76a1205f4cbbf018adfc2db54921fdcd448 a93a46947ffc5df73e97d1c42445c217008c91e7 blob 286863 132594 3545435 c5f2c76a1205f4cbbf018adfc2db54921fdcd448 blob 490195 70876 4934328 4bc4e7daaa3efdd68bc9a22e95377c474bef95c3 blob 1668096 730291 5460526
第一列是表示它的pack的id,拿到它后,这时我们接着下一步,去查看该文件是什么以及文件路径:
2. 查找某个id下的大文件内容
git rev-list --objects --all | grep 918f1535244c0d22b45f24abfafa3f2560623f64
此时我们可以看到:
918f1535244c0d22b45f24abfafa3f2560623f64 pilotage/navigation_provider.cc
3.将该文件从历史记录中移除
git log --pretty=oneline --branches -- pilotage/navigation_provider.cc
4.重写所有 commit,将该文件从 Git 历史中完全移除
git filter-branch --index-filter 'git rm --cached --ignore-unmatch pilotage/navigation_provider.cc' -- --all
如果是删除文件夹,则采用如下命令
git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch pilotage/' -- --all
在执行结果中关注哪个分支发生了改变,信息如下,改变的分支后续都要强制重新推送。
Ref 'refs/remotes/origin/V1.0_Gateway' was rewritten
5.引用完全删除
到这里,历史记录中已经没有该文件了。不过运行 filter-branch 产生的日志还是会对该文件有引用,所以还需要运行以下几条命令,把该文件的引用完全删除:
rm -Rf .git/refs/original //删除git的备份 rm -Rf .git/logs/ // 删除logs git gc //收集所有松散对象并将它们存入 packfile(垃圾回收) git prune //删除所有过期的、不可达的且未被打包的松散对象
这是我们再去查看 .git 的大小,此时文件应该变小了。
6.提交
删除之后,需要以强制覆盖的形式提交上去,如果涉及多个分支,则每个分支都需要推送。
git push origin xxx --force
参考链接:https://zhuanlan.zhihu.com/p/282765421