适用场景
-
误提交密码、密钥、token 等敏感信息
-
误提交大文件导致仓库臃肿
-
需要从所有历史提交中移除某些文件
方法一:git filter-repo(推荐)
安装
pip install git-filter-repo
删除指定文件/目录(从所有历史中移除)
git filter-repo --path .env --invert-paths
git filter-repo --path secrets/ --invert-paths
删除多个路径
git filter-repo --path .env --path config/secrets.json --invert-paths
方法二:BFG Repo-Cleaner
下载 bfg.jar(需要 Java)
https://rtyley.github.io/bfg-repo-cleaner/
删除文件
java -jar bfg.jar --delete-files .env
删除目录
java -jar bfg.jar --delete-folders .idea
替换敏感文本(如密码)
echo "mypassword123" > passwords.txt
java -jar bfg.jar --replace-text passwords.txt
清理并强制推送
git reflog expire --expire=now --all
git gc --prune=now --aggressive
git push --force
方法三:git filter-branch(旧方法,较慢)
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch .env' \
--prune-empty --tag-name-filter cat -- --all
清理
git reflog expire --expire=now --all
git gc --prune=now --aggressive
推送到远程
强制推送(会覆盖远程历史)
git push origin --force --all
git push origin --force --tags
注意事项
| 事项 | 说明 |
|--------------|-------------------------------------------------------|
| 备份 | 操作前务必备份仓库 |
| 协作影响 | 所有协作者需重新 clone 或 git pull --rebase |
| GitHub 缓存 | 联系 GitHub 支持清除缓存,否则旧提交仍可通过 SHA 访问 |
| 已泄露的密钥 | 立即轮换,重写历史不能撤回已泄露的信息 |
工具对比
| 工具 | 速度 | 易用性 | 推荐场景 |
|-------------------|------|--------|----------------|
| git filter-repo | 快 | 简单 | 首选方案 |
| BFG | 快 | 简单 | 替换敏感文本 |
| git filter-branch | 慢 | 复杂 | 不推荐,已废弃 |