ChrAlpha's Blog

如何在 Git 中真正删除一个文件

2020-03-25·便签格

由于 Git 是记录修改而非记录文件的版本控制系统,这使它能够十分方便地退回到任何一个版本。而正是 Git 会记录下所有版本,想要在 Git 中删去一个文件可不像直接删除后再提交。这样还能在之前版本中找到他,万一这还是个敏感内容,该如何真正彻底从 Git 中删除一个文件呢?

其实思路也很简单,使用方法将所有历史 Commit 统统修改即可。这里记录下官方 git filter-branch 方法和 BFG Repo-Cleaner 工具包的两种实现。

BFG Repo-Cleaner

BFG Repo-Cleaner 是一款开源工具,提供了 git filter-branch 的又一实现。这种方法比官方 git filter-branch 构建速度快上不少。

点击上方链接,在右侧边栏就有工具包下载链接。

工具包使用 Java 语言编写,所以若想使用请先安装 Java 运行环境,链接

在使用工具删除所有版本中的文件前,先要删除当前版本的该文件并提交 Commit ,BFG Repo-Cleaner 不会对 HEAD 作任何修改。

然后使用命令:

java -jar /path/to/bfg-1.13.0.jar --delete-files path/to/YOUR-FILE-WITH-SENSITIVE-DATA

注意修改路径对应为自己的。

请注意这样做会修改之前提交的 SHA ,可能影响 Pull Request ,请先关闭所有 Pull Request 。

由于更改了之前的 Commit ,最后请使用 git push --force 强行推送。

官方方案

如果你没有也并不希望安装 JRE ,也可以使用 Git 官方用于修改之前提交的命令 git filter-branch ,但速度上可能会有一定程度的下降。

git filter-branch --force --index-filter "git rm --cache --ignore-unmatch path/to/YOUR-FILE-WITH-SENSITIVE-DATA" --prune-empty --tag-name-filter cat -- --all

注意修改路径对应为自己的。

最后也是需要 git push --force 强行提交,这种操作会重置之前所有 Commit 。

虽说有补救方案,但以后提交还是要注意,不要滥用 git add . ,最好一个个文件 add 。就算修改的文件特别多,也可以先使用 git status 确认无误后在提交。

另外,这里介绍的命令无需专门记住,使用频率十分低,需要的时候再查看一下就好了。这或许也是我专门攥写本文的目的了。


参考链接

如何在 Git 中真正删除一个文件
本文作者
ChrAlpha
发布日期
2020-03-25
更新日期
2020-03-25
转载或引用本文时请遵守 CC BY-NC-SA 4.0 许可协议,注明出处、不得用于商业用途!
CC BY-NC-SA 4.0