在很多情况,我们由于疏忽会将一些敏感信息误传到 Git 仓库上面去。 尽管我们可以使用 git rm 将包含敏感信息文件删除掉,然后重新提交上传,文件就不会在仓库文件列表显示。 但是这并不能完全将敏感信息文件从仓库中完全删除, commit history 仍然会有敏感信息的文件的残留,我们仍然可以从仓库中的 commit history 中访问到文件。

如果想要将敏感信息文件完全删除。不仅需要将文件从 github 中的文件列表中删除,同时还需要将文件从 github 的 commit history 中的 文件相关信息删除。删除 commit history 文件相关信息,主要有两种方法:

  1. filter-branch
  2. BFG

一、filter-branch

1.1 移除数据

filter-branch 是 git 自带的命令:

1
2
3
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \
--prune-empty --tag-name-filter cat -- --all

请将上面命令中的 PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA 替换为你要删除的文件名路径(相对路径、绝对路径均可)。

如果你想删除文件夹的话,只需要添加一个 -r 参数即可,形如:

1
2
3
git filter-branch --force --index-filter \
'git rm -r --cached --ignore-unmatch PATH-TO-YOUR-DIR-WITH-SENSITIVE-DATA' \
--prune-empty --tag-name-filter cat -- --all

1.2 避免再次提交

为了防止敏感文件再次被提交,可以将其加入到 .gitignore 文件中。

1.3 提交仓库

执行以下命令将其强制推送到仓库中:

1
git push origin --force --all

-all 参数将修改作用于远程的所有分支。

1.4 提交 tags

以上命令不会对 tag 生效,如需修改,执行命令:

1
git push origin --force --tags

二、BFG

除了使用 git 自带的 filter-barch 命令,还有一个更加方便的命令工具, 可以帮助我们删除 commit history 中的敏感信息。 这就是 BFG

首先下载 BFG 工具:https://rtyley.github.io/bfg-repo-cleaner

执行命令:

1
java -jar bfg-1.12.16.jar --delete-files YOUR-FILE-WITH-SENSITIVE-DATA

和使用 filter-branch 一样,将 YOUR-FILE-WITH-SENSITIVE-DATA 替换为你要删除的文件路径,然后执行命令提交到仓库中:

1
git push origin --force --all