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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章