場景
在 Git 項目中,我們可能會不小心提交了本應忽略的文件(如 node_modules/
、.env
、*.log
等),導致倉庫體積膨脹或敏感信息泄露。本文介紹如何從 Git 歷史中徹底刪除這些文件,同時保留本地文件。
解決方案
1. 確認誤提交的文件
# 查看 Git 倉庫中的文件(包括已忽略的)
git ls-files
如果發現誤提交的文件(如 config.ini
),可以進一步檢查其 Git 歷史:
git log -- config.ini
2. 從 Git 中移除文件(但保留本地)
使用 git rm --cached
命令:
# 從 Git 索引中移除文件,但不刪除本地文件
git rm --cached config.ini# 如果誤提交的是整個目錄(如 node_modules/)
git rm --cached -r node_modules/
注意:
-cached
確保本地文件不會被刪除- 如果文件已在
.gitignore
中,仍需手動從 Git 中移除
3. 更新 .gitignore(防止再次提交)
# 確保 .gitignore 已包含該文件echo "config.ini" >> .gitignore
echo "node_modules/" >> .gitignore# 檢查 .gitignore 是否生效
git check-ignore -v config.ini
4. 提交更改
git add .gitignore
git commit -m "Remove accidentally committed files"
git push
?? 警告:此時文件仍存在于 Git 歷史中,可能被他人拉取到本地!如需徹底清除,繼續下一步。
到這里基本就可以了,下方作為了解,酌情參考。
進階:徹底清理 Git 歷史中的文件
如果誤提交的文件包含敏感信息(如密碼、密鑰),必須從 Git 歷史中完全刪除,可使用 git filter-repo
(推薦)或 BFG Repo-Cleaner
。
方法 1:使用 git filter-repo
(推薦)
# 安裝 git-filter-repo
pip install git-filter-repo# 從所有提交歷史中刪除文件
git filter-repo --path config.ini --invert-paths# 強制推送清理后的倉庫(?? 會重寫歷史)
git push origin --force --all
方法 2:使用 BFG Repo-Cleaner
(適合大文件)
# 下載 BFG
java -jar bfg.jar --delete-files config.ini .git# 清理 Git 垃圾數據
git reflog expire --expire=now --all
git gc --prune=now --aggressive# 強制推送
git push --force
最佳實踐
-
提交前檢查變更:
git status git diff --cached
-
使用預提交鉤子(pre-commit):
在
.git/hooks/pre-commit
中添加檢查腳本,阻止提交忽略文件。 -
敏感信息處理:
如果誤提交了密碼,立即輪換密鑰,即使已從 Git 中刪除。
總結
操作類型 | 命令示例 | 適用場景 |
---|---|---|
從暫存區移除 | git rm --cached file | 簡單清理,保留本地文件 |
徹底刪除歷史記錄 | git filter-repo --path file | 敏感信息泄露,需完全清除 |
防止未來提交 | 更新 .gitignore | 避免重復錯誤 |
提示:強制推送 (git push --force) 會影響團隊協作,請提前通知其他開發者!