编程

git-filter-branch,从 Git 仓库提交历史记录中永久删除某些文件

1385 2022-05-28 20:18:23

有时,我们会忘记把含有重要安全信息的信息加入 .gitignore 文件中,或者无意中把诸如 vendor、node_modules 这样的文件夹加入到 git 中。这时候我们就不能仅仅删除当前版本记录,还需要到git仓库的历史记录中去永久删除这些文件。此时,我们就要用到 git filter-branch 命令。

假设我们有个密钥文件 storage/key.pem 被加入到git中,要删除它:

git filter-branch --force --prune-empty --index-filter "git rm --cached --ignore-unmatch storage/key.pem" -- --all

如果遇到 fatal: bad revision ‘rm’ 这样的问题,那么你要记住这个命令在 windows 下操作是使用双引号,而不是单引号。

假如文件名含有空格 storage/key copy.pem,可以在文件名中使用转义字符加入双引号,将文件名包起来:

git filter-branch --force --prune-empty --index-filter "git rm --cached --ignore-unmatch \"storage/key copy.pem\"" -- --all

如果需要删除的是文件夹在 rm 里加上 -rf

git filter-branch -f --index-filter "git rm --cached --ignore-unmatch -rf ./node_modules" --prune-empty -- --all

指定文件删除后,把当前记录推送到 Github

git push origin main --force