问题

git 仓库里误提交了大文件或密码,怎么彻底删除?

不小心把一个几百 MB 的压缩包和一个含数据库密码的配置文件提交进了 git,并且已经推送到远程仓库。直接删除文件再提交,仓库体积还是很大,历史记录里也还能看到密码。

Mores小栋博客!

0

删除文件再提交,只是在最新版本里没有了,历史提交里依然保存着。要从历史中彻底去掉,需要改写历史。

第一步:先处理泄露的密码

密码一旦推送到远程,就要当作已经泄露:先去修改密码或者作废密钥,再清理历史。只清理历史是不够的,别人可能早已克隆或者 fork 了仓库。

第二步:用 git filter-repo 改写历史

Bash
# 先单独克隆一份干净的副本来操作
git clone --mirror git@example.com:me/project.git
cd project.git

# 从所有历史中删除指定文件
git filter-repo --path backup.zip --invert-paths
git filter-repo --path config/database.php --invert-paths

# 改写后强制推送
git push --force --mirror

git filter-repo 需要单独安装,它是 Git 官方文档推荐的工具,比旧的 git filter-branch 快得多,也更不容易出错。

第三步:通知协作者

历史改写以后,其他人本地的仓库和远程不再一致,需要重新克隆。托管平台上已有的 fork 和缓存可能仍然保留旧数据,必要时联系平台清理。

以后可以在 .gitignore 里排除压缩包和本地配置文件,敏感配置改用环境变量。

0 条回复

A文章作者M管理员
上传评论图片

暂无讨论,说说你的看法吧