Git 历史记录清洗

当在公网环境下使用 git 仓库不小心把敏感信息提交上去时,则可以使用 filter-branch 对代码仓库进行清洗。

1. 先对本地历史进行清洗

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <file_path>' --prune-empty --tag-name-filter cat -- --all
  • filter-branch 是让git重写每个分支

  • –force 假如遇到冲突也让git强制执行

  • –index-filter 选项指定重写的时候应该执行什么命令

  • –prune-empty 选项告诉git,如果因为重写导致某些commit变成了空(比如修改的文件全部被删除),那么忽略掉这个commit

  • –tag-name-filter 表示对每一个tag如何重命名,重命名的命令紧跟在后面,当前的tag名会从标注输入送给后面的命令,用cat就表示保持tag名不变。

  • 其后的 – 表示分割符,最后的 –all 表示对所有的文件都考虑在内

2. 然后更新仓库源引用为刚才的结果

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

git reflog expire --expire=now --all
git gc --prune=now

3. 更新标签

git push --all --force
git push --tags --force

https://www.jianshu.com/p/11822884b924 https://blog.csdn.net/lwfcgz/article/details/49453375 https://www.cnblogs.com/developer-ios/p/6211903.html https://stackoverflow.com/questions/7654822/remove-refs-original-heads-master-from-git-repo-after-filter-branch-tree-filte https://git-scm.com/book/zh/v1/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-Git-References