从Git历史中完全删除某个文件

Keywords: #技术 #Git

最近不小心将服务器 IP 和数据库密钥随着程序上推送到了 GitHub 的公开仓库,还好发现的早,不然就是一次惨痛的教训。

当我们将密钥、token 等重要数据推送到 GitHub 上时,应该迅速删除 Git 历史记录,同时修改相对应的密钥。只是将仓库设为私密或者删除仓库都不是很好的选择。

从 Git 历史中完全删除一个文件,可以使用 git filter-branch 命令

  1. 备份原始仓库,以便后续需要重新添加删除敏感数据后的代码文件。
  2. 克隆远程仓库或者在本地仓库中执行下面的命令:
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch path-to-your-file" --prune-empty --tag-name-filter cat -- --all

其中 path-to-your-file 是你需要删除记录的文件路径。

  1. 将敏感文件添加进 .gitignore 防止再次被提交
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore

如果是在代码中混入了敏感数据,需要重新修改代码,删除敏感数据,再次添加进本地仓库中。

  1. 强制推送到远程仓库:
git push origin --force --all
  1. 如果有标签,还需要针对 Git 标记强制推送:
git push origin --force --tags
  1. 最后还需要清理本地仓库:
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now