如何从 Git 历史中彻底删除误上传的敏感信息

如果你不小心提交了包含敏感信息(如 API 密钥、数据库密码)的 .env 文件到 Git 仓库,需要 彻底删除 这个文件及其历史记录,以防泄露。以下是完整的处理步骤。

1. 立即更改敏感信息

重要! .env 文件中的密码和密钥可能已经泄露,立即更改相关凭据,如:

  • 数据库密码
  • API 密钥
  • OAuth 令牌
  • SSH 私钥

2. 确保 .env 文件不会再被提交

.env 添加到 .gitignore,防止再次提交:

echo ".env" >> .gitignore
git add .gitignore
git commit -m "Add .env to .gitignore"

3. 从 Git 历史中删除 .env 文件

推荐方式:使用 git filter-repo

git filter-repo 是 Git 官方推荐的工具,速度快且更安全。

3.1 安装 git filter-repo

如果尚未安装,可以运行:

pip install git-filter-repo

3.2 彻底删除 .env 文件

在 Git 仓库根目录运行:

git filter-repo --path .env --invert-paths

参数解析:

  • --path .env:指定要删除的文件
  • --invert-paths:删除所有提交中 .env 文件的历史记录

4. 验证 .env 是否彻底删除

检查 .env 是否仍在历史记录中:

git log -- .env
git log -S"你的敏感信息"

如果没有返回任何记录,说明 .env 文件及其历史已经删除。

5. 强制推送到远程仓库

由于改写了 Git 历史,必须使用 --force 强制推送:

git push origin main --force

注意:

  • 所有协作者 需要重新克隆仓库,否则 git pull 会失败。
  • 确保 .env 不会再提交(参考步骤 2)。

6. 清理本地和远程的旧引用

如果 .env 可能出现在其他分支,确保所有分支都清理干净:

git push origin --all --force

7. 确保 .env 在远程仓库中消失

前往 GitHub / GitLab 仓库,检查 .env 是否仍然可见:

  • 如果仍然存在,可能是缓存未清除,联系托管平台的技术支持要求彻底清除。

8. 预防未来类似问题

  • 使用 .gitignore 确保敏感文件不会进入 Git 版本控制
  • 使用环境变量管理工具(如 dotenv)存储敏感数据
  • 定期检查 Git 提交,避免误提交敏感信息:
git log -p | grep "API_KEY"

重要提醒

  • 备份代码:执行 git filter-repo 之前,建议 备份仓库,以防误删。
  • 通知协作者:如果有其他人参与该仓库开发,他们需要重新克隆仓库,否则会遇到同步问题。
  • 合规性问题:如果泄露的是 用户数据,请考虑是否需要上报安全事件
  • 对于 GitHub 仓库:如果 .env 仍然可见,可以尝试 GitHub API 请求删除缓存或联系 GitHub 支持。
  • 对于 GitLab:使用 git gc --prune=now 清理本地仓库,并在 GitLab 管理面板中触发仓库垃圾回收。
  • 企业环境:如果 Git 服务器由企业管理可与管理员协商执行全局清理。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注