如何删除Git仓库中的敏感文件及其历史记录

本文主要介绍如何使用 git filter-branch 命令删除 Git 仓库中的敏感文件及其历史记录。在 Git 中,我们通常会将敏感信息(如密码、私钥等)存储在 .gitignore 文件中,以防止这些信息被意外提交到仓库。有时候,因为疏忽或私有仓库转公开仓库,我们可能需要删除某个特定的敏感文件及其历史记录。

1. 背景

因为我开一个新的项目的时候习惯先使用私有仓库,当完善的差不多的时候再转为公开,私有库就随便了些,可能存在一些不合适公开的一些信息,所以需要在转为公开仓库前检查删除一些内容。当然,也有可能是一些私钥等信息因为疏忽,没有加入到.gitignore 文件中,被错误的跟踪了。

2. 操作步骤

2.1 备份仓库

保险起见,在进行任何操作之前,建议先创建仓库的备份,以防万一发生不可预知的问题。这里我们可以直接复制文件夹,或者在其他文件夹 git clone 一下仓库。

2.3 运行git filter-branch

进入仓库目录,使用 git filter-branch 命令删除敏感文件及其历史记录。将 config/your-sensitive-file.json 替换为要删除的文件的路径。需要注意路径使用的是斜杆/而非反斜杠\

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch config/your-sensitive-file.json" --prune-empty --tag-name-filter cat -- --all

这个命令将从所有分支和标签中删除指定文件的历史记录。

在这里插入图片描述
使用git-filter-branch会显示警告信息,如果你误操作可以使用Ctrl-C取消,命令的执行留足了反应时间。

WARNING: git-filter-branch has a glut of gotchas generating mangled history  
         rewrites.  Hit Ctrl-C before proceeding to abort, then use an       
         alternative filtering tool such as 'git filter-repo'
         (https://github.com/newren/git-filter-repo/) instead.  See the      
         filter-branch manual page for more details; to squelch this warning,
         set FILTER_BRANCH_SQUELCH_WARNING=1.

这个警告是因为 git-filter-branch 命令在处理复杂的历史重写时可能会产生一些问题。警告建议您使用其他过滤工具,如 git filter-repo,以避免可能的问题。

虽然其是一个更现代、更强大的工具,可以更好地处理复杂的历史重写,但是需要额外的安装操作。

2.4 垃圾回收

运行以下命令以删除未引用的数据并压缩仓库。这将帮助减少仓库的大小。

git reflog expire --expire=now --all
git gc --prune=now --aggressive

2.5 推送更改

将清理后的仓库推送回原始仓库。这将覆盖所有分支和标签。

git push --force

完成以上步骤后,敏感文件及其历史记录将从Git仓库中删除。

请注意,这种方法可能导致其他协作者的仓库出现问题。建议通知其他协作者在合并更改之前重新克隆仓库。如果你是一个人使用,那就无所谓了。

3. 结论

本文介绍了如何使用 git filter-branch 命令手动删除Git仓库中的敏感文件及其历史记录。虽然这种方法需要一些手动操作,但它不需要安装任何第三方工具。在一些特殊情况下,可以解决大麻烦。但是,如果你的仓库是公开的或已被 fork,并且其中包含了敏感信息,例如私钥或密码,及时更新秘钥和密码才是正确的选择。

猜你喜欢

转载自blog.csdn.net/marin1993/article/details/131499236
今日推荐