Git:如何从历史提交中删除文件?

我已经提交id 56f06019(例如)。 在那个提交我不小心承诺大文件(50Mb)。 在另一个提交我添加相同的文件,但在正确的大小(小)。 现在我的回购当我克隆是太重:(如何从回购历史中删除该大文件,以减less我的回购大小?

Pro Git书的第9章有关于删除对象的章节。

让我在这里简要地概述步骤:

git filter-branch --index-filter \ 'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \ --tag-name-filter cat -- --all 

像之前描述的重新布局选项一样, filter-branch是重写操作。 如果你已经发布了历史,你将不得不推出新的参考文献。

因为它filter-branch方法比rebase方法强大得多

  • 允许您一次在所有分支/裁判工作,
  • 随时重新命名任何标签
  • 即使自添加文件以来已经进行了多次合并提交,也可以干净地运行
  • 即使在(a)分支(es)的历史中多次(重新)添加/移除文件,
  • 不会创build新的,不相关的提交,而是在修改与之相关的树的同时复制它们。 这意味着像有签名的提交,提交笔记等东西被保留

filter-branch保留备份,所以回购的大小不会立即减less,除非你过期reflogs和垃圾收集:

 rm -Rf .git/refs/original # careful git gc --aggressive --prune=now # danger 

你将需要在交互模式中看到一个例子git rebase : 我怎样才能删除提交GitHub? 以及如何删除旧的提交 。

如果您的提交是在HEAD减10提交:

 $ git rebase -i HEAD~10 

在你的历史版本之后,你需要推动“新的”历史,你需要添加+来强制(请参阅推送选项中的refspec):

 $ git push origin +master 

如果其他人已经克隆了您的存储库,则会通知他们,因为您刚更改了历史logging。

你可以使用git-extras工具。 obliterate命令完全从存储库中删除文件,包括过去的提交和标签。

https://github.com/tj/git-extras/blob/master/Commands.md