在日常开发过程中,如果不小心将一个敏感文件,或者一个不必要的文件提交到git仓库时,可能会引起不良的后果。一般情况下可以使用 git rm 删除这个文件,但是 git 历史中依然保存了这个文件的历史版本。如果要彻底删除它,可以使用 命令来彻底删除。

删除缓存

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch password.txt' --prune-empty --tag-name-filter cat -- --all

命令解释

  • filter-branch : 让git重写每一个分支
  • –force : 遇到冲突也强制执行
  • –index-filter : 指定重写的时候执行什么命令,在这里是 git rm --cached --ignore-unmatch password.txt ,让git删除掉缓存的文件。
  • –prune-empty : 如果重写导致commit变成了空(比如修改的文件全部被删除),那么删除掉这个commit。
  • –tag-name-filter : 重写标签名称的过滤器,表示对每一个tag如何处理,当前的tag会标准输入的形式输入给命令,命令执行的标准输出值做为新的tag标记。这里的 cat 就表示保持tag名不变。
  • : 分割符
  • –all : rev-list,表示针对所有的文件

提交

git push -f --all