如何删除或隐藏GitHub历史提交?误提交泄露private key怎么办
不需要删除整个仓库,你可以直接删除包含敏感信息的历史提交记录,操作方法如下:
重要前置操作:立刻作废所有已经泄露的私钥,重新生成新的密钥替换到业务中。即使你删除了历史提交,也无法保证泄露的密钥没有被第三方获取,这一步是避免损失的核心
方案1:删除指定文件的所有历史提交记录(官方推荐方案)
这个方案适合敏感文件分布在多个历史提交、需要彻底抹去该文件所有提交痕迹的场景,使用Git官方推荐的git filter-repo工具操作:
- 第一步:提前备份整个本地仓库,避免操作失误导致代码丢失
- 第二步:安装
git filter-repo工具:- Mac系统执行:
brew install git-filter-repo - Debian/Ubuntu系统执行:
apt install git-filter-repo - Windows系统使用2.38及以上版本的Git for Windows,已经自带该工具无需额外安装
- Mac系统执行:
- 第三步:进入本地仓库根目录,执行命令删除对应文件的所有历史记录,将下方命令中的
<敏感文件路径>替换为你实际的私钥文件路径:git filter-repo --invert-paths --path "<敏感文件路径>" - 第四步:强制推送修改后的提交历史到GitHub远程仓库:
git push origin --force --all git push origin --force --tags
方案2:回退到敏感提交之前的版本(适合近几次提交出现敏感内容的场景)
如果私钥只在最近几次提交中出现,你可以直接回退到提交私钥之前的正常版本,再重新提交修改后的内容:
- 第一步:找到提交私钥之前的正常commit的哈希值,可通过
git log命令查询 - 第二步:执行回退命令,将
<正常commit哈希值>替换为你查询到的哈希:git reset --soft <正常commit哈希值>
执行后你在该commit之后的所有代码修改都会保留在工作区,不会丢失 - 第三步:删除敏感私钥文件、替换为正确的无敏感信息的文件后,重新执行
git add、git commit提交代码 - 第四步:强制推送到远程仓库,将
<分支名>替换为你实际的分支名(通常为main或master):git push origin <分支名> --force
操作完成后的核对
操作完成后你可以在GitHub上查看历史提交记录,确认包含敏感信息的提交已经被完全清除。
如果有其他协作者共同维护该仓库,需要通知所有协作者同步最新的提交历史,避免本地留存的旧提交记录被重新推送到远程仓库。

内容的提问来源于stack exchange,提问作者Waleed Tariq
相关产品推荐
相关产品推荐

