徹底刪除誤提交到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