把 secret 提交进 Git 历史后,第一步永远是废弃并轮换密钥。
清理历史只能减少继续传播,不能让已经泄露的 secret 恢复安全。
推荐使用 git filter-repo:
git filter-repo --path path/to/secret-file --invert-paths
先在没有待处理本地编辑的专用 clone 中执行,确认 path/to/secret-file 是已泄露的真实路径,并由安全 owner 和仓库 owner 明确受影响的远端、分支、标签、分支保护规则及协作者恢复方案。
以下强推适用于已确认该远端全部分支和标签都需要同步重写后的历史。<affected-remote> 是已核实的远端名:
git push --force --all <affected-remote>
git push --force --tags <affected-remote>
历史重写会影响所有协作者,执行前必须通知团队,并要求所有人按已约定的恢复方案重新同步仓库。这个流程只用于已泄露 secret 的事故处置,普通历史整理不应扩大为对全部分支和标签的强推。