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

问题描述

我已经多次使用 BFG Repo-Cleaner 来删除过去添加了数十次/数百次提交的凭据,并且该工具运行良好,但是对于如下所示的较小规模的情况,我想知道是否这是必要的。

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

同样,如果凭据是在最近的提交中添加的,并且立即发现了此错误,是否足以从文件 [s] 中删除凭据并仅运行 git commit -a --amend?或者在这种情况下 reflog 也会被污染?

如果引用日志在任何一种情况下都受到污染,运行 git reflog expire --expire=Now --all && git gc --prune=Now --aggressive 之类的内容删除凭据吗?

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

解决方法

是的,有保存在引用日志中

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

reflog 不会被推送。只有引用的提交是。

当你推送时,你只是推送某些分支/标签的提交。不推送未引用的提交。

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