如果通过修改添加凭据的提交从存储库中删除凭据,并且重新应用后续提交,reflog 是否仍然受到污染?

If credentials are removed from a repo by amending the commit that added them, and subsequent commits are reapplied, is the reflog still tainted?

我已经使用 BFG Repo-Cleaner 几次来删除过去添加的 dozens/hundreds 提交的凭据,并且该工具运行良好,但对于像下面这样的小规模情况,我我想知道是否有必要。

假设有一个本地存储库,有人不小心向其提交了数据库凭据,并且他们直到几次提交后才注意到他们已经这样做了。如果 git reset --hard [COMMIT_ID] 用于将历史倒回添加凭据的提交,然后该提交被修改为没有凭据,然后重新应用后续提交,凭据是否仍会在某个地方的 reflog 中?如果是这样,是否存在将它们推送到远程的风险?

类似地,如果在最近的提交中添加了凭据并且立即注意到了这个错误,是否足以从文件[s] 中删除凭据并仅 运行 git commit -a --amend?或者在那种情况下 reflog 也会被污染吗?

如果 reflog 在任何一种情况下都被污染,运行宁 git reflog expire --expire=now --all && git gc --prune=now --aggressive 之类的东西会删除凭据吗?

(这些特定命令来自 BFG 的文档;它们应该 运行 在该工具完成其在 repo 上的工作后。)

是的,有 保留在 reflog 中。

reflog可以被认为是所有refs的日志。创建提交时,它会添加到引用日志中。当您修改提交时,您会创建一个添加到 reflog 的新提交。当您从 commit/amend 中删除所有引用时,它不会从 tge reflog 中删除,因为它只包含引用,因此您可以从中恢复。毕竟,它是用户的安全机制(恢复丢失的提交等)而不是共享的东西。

reflog 未推送。只有引用的提交是。

当你推送时,你只是推送某些branches/tags的提交。未被引用的提交不会被推送。

是的,git reflog expire --expire=now --all && git gc --prune=now --aggressive 删除 reflog 和未引用的提交,但在你的情况下你不需要它,因为它们没有被推送。