昨天帮助小伙伴从 Git 提交历史中删除了一个文件,虽然一开始尝试使用 filter-branch,但是因为需要的时间太久,就放弃了,转而使用 cherry-pick 的方案。

但是,毕竟 Git 官方给的方案是 filter-branch,所以今天就在另一位小伙伴的帮助下好好阅读 Git 官方文档:Git - 重写历史Git - git-filter-branch Documentation


原来参数中是可以指定查找范围的!几万个提交的仓库,既然是当天加的文件,当然没必要遍历整个仓库,数了数大概是 20+ 个提交之前加的,于是写出了如下命令:

git filter-branch --tree-filter 'git rm file-name-to-remove.zip' HEAD~30..HEAD

最后那个参数就是从当前分支的前 30 次提交开始遍历,这样就会快很多。

下面的输入和输出是我在拿上一篇博客文件做试验,删掉那篇博客。整个仓库有 125 次提交,但只需遍历参数里指定的 5 个。

$ git filter-branch --tree-filter 'rm _posts/2017-09-18-delete-a-file-from-whole-git-history.md' HEAD~5..HEAD
Rewrite f74ff6c8057dcfdf96822989a09c357ae07cd2f8 (5/5) (2 seconds passed, remaining 0 predicted)
Ref 'refs/heads/master' was rewritten

参考资料


本文会经常更新,请阅读原文: https://walterlv.github.io/git/2017/09/19/delete-file-using-filter-branch.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系