$ git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PATH" --prune-empty --tag-name-filter cat -- --all
filter-branch 让git重写每一个分支,
–force 假如遇到冲突也让git强制执行,
–index-filter 选项指定重写的时候应该执行什么命令,要执行的命令紧跟在它的后面,在这里就是git rm --cached --ignore-unmatch password.txt ,让git删除掉缓存的文件,如果有匹配的话(具体删除哪种类型就按哪种命令来执行就可以)。
–prune-empty 选项告诉git,如果因为重写导致某些commit变成了空(比如修改的文件全部被删除),那么忽略掉这个commit。
–tag-name-filter 表示对每一个tag如何重命名,重命名的命令紧跟在后面,当前的tag名会从标注输入送给后面的命令,用cat就表示保持tag名不变。
紧跟着的-- 表示分割符,
最后的–all 表示对所有的文件都考虑在内。
参考:https://docs.github.com/en/github/authenticating-to-github/removing-sensitive-data-from-a-repository