密钥等隐私数据上传到了 Github,Git 怎么完全从历史中删除某个文件?

你有没有不小心把密码,密钥,token 等重要数据随着代码一起上传到 Github 的惨痛经验?

如果你刚好犯了这个错误,希望这篇文章能帮助到你把隐私文件从 git 的历史记录,以及 github 上面删除。

要从 Git 历史中完全删除一个文件,包括远程仓库,你可以使用 git filter-branch 命令或者 BFG Repo-Cleaner 工具。这里我将展示如何使用 git filter-branch 命令。

首先,你需要在本地仓库中执行这个命令。然后,你需要强制推送到远程仓库。请注意,这将重写你的提交历史,所以如果有其他人正在使用这个仓库,你需要通知他们。

以下是步骤:

  1. 在你的本地仓库中,运行以下命令,将 file-to-remove 替换为你要删除的文件的路径:

    git filter-branch --force --index-filter \
    "git rm --cached --ignore-unmatch path-to-your-file" \
    --prune-empty --tag-name-filter cat -- --all

    path-to-your-file 是你要删除的文件路径。

  2. 然后,你需要强制推送到远程仓库:

    git push origin --force --all
  3. 如果你有标签,你也需要强制推送它们:

    git push origin --force --tags
  4. 在你的本地仓库中,你可能还需要进行一些清理工作,以删除旧的未引用的对象:

    git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
    git reflog expire --expire=now --all
    git gc --prune=now

    请注意,这个过程将不可逆,所以在执行前请确保你有一个备份。

除了删除 Github 上的记录,建议同时把已经泄露的密码, token, 密钥都立即重置,因为有无数的脚本和机器人在盯着 Github 上的代码,我们一不小心上传了隐私信息,他们就会马上记录下来,然后拿去干坏事。