彻底删除误提交到git仓库的文件

彻底删除误提交到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

你可能感兴趣的:(未分类)