如何从 BitBucket git 存储库历史记录中删除带有密码的提交?

How to delete a commit with a password from BitBucket git repository history?

前段时间我不小心将密码提交到 BitBucket git 存储库,在当前主控之后提交了几次。虽然我后来通过提交没有密码删除了密码,但它仍然存在于过去的几次提交中。

我不介意在这些提交期间丢失更改历史记录。我也不担心有人在提交密码时看到了密码,但我想删除此历史记录以避免将来出现问题。

采取什么步骤来确保在这些步骤之后,以后访问此 BitBucket 存储库的任何人都无法找到此密码?

假设我有使用(假)SHA1 的提交(从最旧到最新): c001 c002 c003 c004

c002 和 c003 是我想完全删除的 "bad" 提交的哈希值。我希望 master 留在 c004,但是如果我允许任何人访问此 repo,则 c002 和 c003 将不再可供任何人访问。 我尝试按照 SO 上类似问题的说明进行重置或变基,但无法让它们工作;我要么设法删除了我机器上的提交,但随后无法推送回 BitBucket,要么在我的机器上搞砸了之后完全无法删除。

有人可以解释一下执行以下操作所需的步骤吗: 1. 从存储库的历史中删除 c002 和 c003 2. 确保它保存在 BitBucket 上,并且人们既不能在 BitBucket 的 GUI 中查看这些提交,也不能通过将 repo 克隆到他们的机器

我希望得到解释这些命令的作用的答案,而不仅仅是编写一些对我有用或不起作用的神奇 git 命令。 此外,这个问题是专门针对 BitBucket 的,以防某些事情可能是特定于它的……我在使用 reset --hard 进行本地回购更改后尝试将更改推送回 BitBucket 时遇到了 "Updates were rejected because the tip of your current branch is behind" 的问题。在几次失败的尝试和对 git 的文档感到沮丧之后,我决定问 SO。

.

您可以结合使用 rebasegit push origin master --force 来重写存储库的历史记录并强制推送您的更改,这样就没有人能够在提交历史。

从您的主分支,您可以执行 git rebase origin/master -i 然后 edit 您推送密码的提交。然后运行 git add . 添加它- 然后 git commit --amendgit rebase --continue 继续 rebase。完成后,git push origin master 强制推动它并按照您想要的方式重写历史记录。

我会做的是:

git checkout revision-where-the-file-was-added
git rm the-file-with-the-password
git commit --amend --no-edit # fix the revision
git cherry-pick revision-where-the-file-was-added..the-branch # replay all later revision
# if you like the result
git branch -f the-branch
git push -f origin the-branch
git checkout the-branch

这假定在添加文件后只有一行修订。如果以后的历史中涉及合并,您可能需要使用 cherry-pick 中的选项。