标签: 代码管理

  • 如何从 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 服务器由企业管理可与管理员协商执行全局清理。