Git从历史记录中删除大文件

时间:2015-06-20 23:10:20

标签: git git-filter-branch git-rewrite-history

我有一个巨大的git存储库(810mb),其中包含大型文件,不应该存在:完整的JRE存档,位于build/java文件夹中。

我正在尝试删除这些文件,所以我跑了:

 git filter-branch --tree-filter 'rm -rf build/java' HEAD

我现在看到消息:Your branch and 'origin/develop' have diverged, and have 414 and 414 different commits each, respectively. (use "git pull" to merge the remote branch into yours)

我不想运行git pull,但在推送到github上的远程存储库之前,我想看到存储库已经缩小。

不幸的是,我仍然认为它是810mb。

我做错了什么?我该如何缩小该存储库?

TIA!

2 个答案:

答案 0 :(得分:1)

首先,我强烈建议使用' bfg repo cleaner'从存储库中删除大文件。

其次,当您使用github时,您应该知道可以使用新功能来处理某些类型的文件:git lfs

  

不幸的是,我仍然认为它是810mb

实际上,当您使用filter-branch时,git会在前缀original下的操作期间创建所有更新引用的保存。 在您没有通过删除这些引用接受更改并完成垃圾收集之前,所有对象仍然在git'数据库中。和大小保持不变!

答案 1 :(得分:0)

执行

git reflog

要查看过去30天(默认保留期)中您所在的所有提交的历史记录,位于分支机构的顶部。即使您重新设置了分支,旧分支上的提交仍然在git的reflog历史记录中,这可以防止它们的父提交与它们引用的任何文件一起被清除。

因此,如果某些不需要的文件仍然存在于任何这些存档提交的历史记录中的任何位置,这将有效地防止git使用不需要的文件清除提交。

为了确保您已从存储库中清除这些文件,您必须:

1)删除整个reflog历史记录

git reflog expire --all

2)弄清楚任何标记或分支是否仍有其历史记录中的任何不需要的文件,并弄清楚如何处理它。删除分支/标记,或者也将其过滤掉。

3)运行git gc进行垃圾回收。

这应该最终从本地git存储库中删除所有删除的文件。

这里有一个坏消息:当你最终推出干净的分支时,非常确定这不会保证不需要的文件也会从你的github repo中删除。您所做的就是推动分支机构的提交。这不一定会导致远程git repo被垃圾收集。在垃圾收集他们的回购时,我不熟悉github的默认配置。你必须对此进行调查。