在使用 GitHub 的過程中,假如某次提交代碼時不小心將敏感信息
提交進了公共倉庫。
如果發現得及時,本地提交後還沒有推送到 GitHub 遠程倉庫的話,這種情況還好處理,直接修改代碼後通過git commit --amend
即可。
但如果發現時已經推送到了 GitHub 遠程倉庫,或者已過了許久,後續有了很多新的 commits,這種情況就會比較複雜了。
1、第一步
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch 你要刪除的文件(相對項目的路徑)" --prune-empty --tag-name-filter cat -- --all
如下:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch ./picgo/20220418121957.png' --prune-empty --tag-name-filter cat -- --all
- --force:強制執行操作,即使會丟失一些提交。
- --index-filter:通過對索引進行操作來修改歷史記錄,後面的 'git rm --cached --ignore-unmatch ./picgo/20220418121957.png' 表示要執行的具體命令,即移除指定路徑對應的文件。
- --prune-empty:在處理過程中,移除空的提交。
- --tag-name-filter:對標籤進行操作,cat 表示保持標籤名稱不變。
- -- --all:表示將命令應用於所有分支和標籤。
2、第二步
強制推送所有分支和標籤
git push origin --force --all
git push origin --force --tags
3、第三步
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin #刪除 refs/original 引用中的每一個引用
git reflog expire --expire=now --all #清理所有引用(分支、標籤等)的reflog。reflog記錄了引用的移動、重置等操作歷史
git gc --prune=now #用於垃圾回收,即清理不再需要的對象