彻底删除误提交到git仓库的文件
参考
简要版
https://blog.csdn.net/lwfcgz/article/details/49453375
复杂版:
https://stackoverflow.com/questions/2004024/how-to-permanently-delete-a-file-stored-in-git
https://blog.csdn.net/xiaosongluo/article/details/84194792
https://blog.csdn.net/weixin_34392435/article/details/92166474
相关命令
(1)查看有前3大的文件
不一定生效,路径pack可能没东西
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -n | tail -3
(2)查找文件路径
查所有
git rev-list --objects --all
过滤出符合正则的
git rev-list --objects --all | grep <SHA>
(3)查出某个文件的commit id
git log --pretty=oneline --branches -- file_path
正文
- 不小心将
尼玛.mp4
commit到仓库- 已经push到远端
- 尼玛.mp4很大,不想要它
1 重写分支
先执行以下命令,重写分支,清理误提交文件。
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 尼玛.mp4' --prune-empty --tag-name-filter cat -- --all
说明:
filter-branch 是让git重写每一个分支,
–force 假如遇到冲突也让git强制执行,
–index-filter 选项指定重写的时候应该执行什么命令,要执行的命令紧跟在它的后面,在这里就是git rm --cached --ignore-unmatch password.txt ,让git删除掉缓存的文件,如果有匹配的话。
–prune-empty 选项告诉git,如果因为重写导致某些commit变成了空(比如修改的文件全部被删除),那么忽略掉这个commit。
–tag-name-filter 表示对每一个tag如何重命名,重命名的命令紧跟在后面,当前的tag名会从标注输入送给后面的命令,用cat就表示保持tag名不变。
紧跟着的-- 表示分割符,最后的–all 表示对所有的文件都考虑在内。
2 清理本地仓库中的无效对象
上一步已将相关索引修正,移除了 尼玛.mp4
引用。于是可以清理掉它。
为保证数据完整性,先进行数据校验吧
# 删除original文件夹
rm -rf .git/refs/original/
# 修剪旧的reflog条目
git reflog expire --expire=now --all
# 验证数据库中对象的连接性和有效性
git fsck --full --unreachable
# 打包解压缩的对象。 删除冗余的对象
git repack -A -d
# 清理不必要的文件并优化本地存储库
git gc --aggressive --prune=now
此时本地 git 仓库已经正常了。
3、强推所有修改到远端
git push origin --force --all
4、清理远端仓库
远端仓库也应该清理。到远端项目(裸库)执行第2步的命令,清理仓库。
——end