Git - 如何从提交历史中删除大文件,以便我可以推送存储库?

时间:2014-08-28 13:54:12

标签: git github

几个月前,我意外地向我的存储库提交了一个重约100MB的目录。

快进到今天,我正在尝试将该回购迁移到Github。由于尺寸限制,它不会让我。

我使用以下帖子删除了该目录:Completely remove file from all Git repository commit history

它似乎已经奏效,但整个项目仍然重达100M。 我已经运行du .并得到以下行:98M ./.git/objects

我不知道如何解决这个问题,因为我尝试了一些解决方案,但似乎都没有。

我现在该怎么办?

编辑:我设法使用我上面链接的线程修复它。特别是达伦的回答。

2 个答案:

答案 0 :(得分:1)

您需要在reflog中输入expire个条目,否则它将保留对这些旧blob的引用,然后garbage collect

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

如果不起作用,请尝试使用BFG工具清理您的仓库。按照他们的说法,首先制作存储库的副本。

答案 1 :(得分:1)

我设法使用上面链接的线程修复它。具体来说,我做了类似Darren的回答。为方便起见,我会把它放在这里:

  

这是最好的方法:
  http://github.com/guides/completely-remove-a-file-from-all-revisions

     

请务必先备份文件的副本。

     

修改

     

[Neon] [1]的编辑在审核过程中遗憾地被拒绝了。看到   下面的霓虹灯,它可能包含有用的信息!

     

[1]:https://stackoverflow.com/users/309261/neon

     
     

E.g。删除意外提交到git的所有*.gz个文件   存储库:

$ du -sh .git ==> e.g. 100M
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch *.gz' HEAD
$ git push origin master --force
$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now
$ git gc --aggressive --prune=now
     

那对我来说仍然没有用? (我目前正在使用git版本1.7.6.1)

$ du -sh .git ==> e.g. 100M
     

不知道为什么,因为我只有一个主分支。无论如何,我终于   让我的git repo真正清理干净,推入一个新的空的裸露   git仓库,例如

$ git init --bare /path/to/newcleanrepo.git
$ git push /path/to/newcleanrepo.git master
$ du -sh /path/to/newcleanrepo.git ==> e.g. 5M 
     

(是!)

     

然后我将其克隆到一个新目录并移过它的.git文件夹   进入这个。 e.g。

$ mv .git ../large_dot_git
$ git clone /path/to/newcleanrepo.git ../tmpdir
$ mv ../tmpdir/.git .
$ du -sh .git ==> e.g. 5M 
     

(是的!终于清理干净了!)

     

在验证一切正常后,您可以删除   ../large_dot_git../tmpdir目录(可能是一对   从现在开始的几个月或几个月,以防万一...)

简而言之:我过滤了分支,创建了一个新的裸仓库,将主机推送到它,将其克隆到一个新目录中,并用克隆中的git目录替换了我的项目的git目录。