无法删除 ghost 分支 github/BLOB

Can't remove ghost branch github/BLOB

我的电子邮件提供商发现了一个公开的 API 密钥并从我的 github 存储库创建了一个分支:

我从我的存储库中删除了我的 config.js 文件,github 说我只有一个分支。

该文件仍然存在,因为他们向我发送了一个 link 到该特定文件,这就是该文件的分支显示的位置。

我试过切换分支,创建一个新的分支,名字和它的名字一样,但什么都没有。我怎样才能删除那个文件或整个分支?

因此,即使您添加了新提交以将其从 master 中删除, 提交 仍保留在 master 的历史记录中。

注意cbe85dc不是分支,而是提交。它是 master 历史的一部分,如果你有一个 public GitHub 存储库,那么即使你在以后的提交中删除 API 密钥,任何人都可以看到它.

我将继续使用 interactive-rebase 编辑此提交以删除 api 键。 同时,您可以在删除 api 键的地方删除提交(当 API 键已经被删除时,删除它是否不再有意义)。

警告:这涉及重写历史记录,需要强制推动才能更正 GitHub。如果存储库上有多个贡献者,或者您将其克隆到多台计算机,则不鼓励这样做,因为在您强制推送到 [=12= 之后,每个人都需要“硬重置”或删除并重新克隆他们的本地存储库].

如果您确定没问题,我会按照以下步骤进行:

git rebase -i cbe85dc~1

这将在您的编辑器中打开 interactive-rebase,它看起来像这样

pick cbe85dc Some message
pick abcdef  Another message
pick defabc  Yet another message

# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# d, drop <commit> = remove commit
...

现在,将 cbe85dcpick 更改为 edit。 您还应该看到您后来删除 API 键的提交,对于此提交,您可以将 pick 更改为 drop 以删除提交。

保存并退出您的编辑器,您应该处于“变基”状态以进行编辑cbe85dc。 现在删除 API 键,并修改提交(更新文件,git add 文件,然后 git commit --amend)。

然后 git rebase --continue 在您的更改之上重播以后的每个提交。 现在,如果一切顺利,您可以使用 git push origin master -f

强制将您的更改推送到 github

此时提交 cbe85dc 不再是 master 历史的一部分,一段时间后将被垃圾收集删除。编辑后的提交获得一个新的哈希值。您仍然应该认为 API 密钥已泄露并获得一个新密钥。


或者您可以使用 filter-branch 命令,但这也会重写历史记录,并且需要强制推送等。就个人而言,我会使用 interactive-rebase,因为这是我习惯的。

有关详细信息,请参阅 here from the Git book

您的提供商发送给您的 link 可能是针对特定提交的。即使该提交已从您的历史记录中重新定位并且您已强制推送,GitHub 通常不会修剪旧提交,因此它们仍然可以访问。

必须假设您推送到public 存储库的任何秘密都已泄露。您应该撤销 API 密钥并生成一个新密钥,在这种情况下 GitHub 是否坚持提交并不重要。这是本案例的标准安全最佳实践。

如果您确实需要将其从历史记录中删除,GitHub has a document 描述了执行此操作的过程。