Git Disaster:1.2GB隐藏在.git中

时间:2014-09-25 13:08:15

标签: git github

我们正在处理以下问题:

我们正在处理大约1.2 GB的数据。因为我们切换到另一种数据格式 忘记将新格式放入.gitignore。在我们注意到所有文件都已添加之后,我们将它们全部删除并提交,但为时已晚,现在我们无法再推送到服务器,因为它对于带宽来说太大了!

我们已经尝试了

sudo git filter-branch --tree-filter "rm -f *.nc" HEAD 

但这不起作用!推送仍试图推动所有~3000个物体!那么我们怎么能继续下去,因为我们真的遇到麻烦,因为它们无法相互沟通。

2 个答案:

答案 0 :(得分:3)

是的,git filter-branch是一种方法。

但是既然你要改变历史,你可以挤出从历史中有问题的部分,然后cherry-pick后来的好提交,就像我最近解释的那样{ {3}}

然后你可以git gc --prune删除无用的巨大提交。

并使用git push -f覆盖服务器端的历史记录。

答案 1 :(得分:0)

首先确定您要处理的有多少有问题的提交。 Filter-branch功能强大,但使用起来也很混乱,并且语法奇怪。对我来说,如果有问题的提交数量<10,我会使用rebase,如果它> 10,我会使用过滤器分支。

对于过滤器分支解决方案,通常使用--index-filter形式。您可以使用* .nc代替文件名。但是如果你的nc文件分散了,你可能还需要为递归添加-r,并且你可能还需要添加--prune-empty。

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

对于最小数量的提交git rebase -i HEAD~X会更简单。只需更改选择以进行编辑,返回并清除提交以删除错误文件并添加.gitignore。

执行此操作后,您将修复修订历史记录。尽管如此,你还是无法收集垃圾。

如果您使用过滤器分支,则会创建一堆备份引用。您需要使用

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

对于过滤器或rebase解决方案,您还需要使reflogs到期

git reflog expire --expire=now --all

现在,您最终可以回收对象占用的磁盘空间

git gc --prune=now

那将会修复&#39;无论你目前正在做什么回购。如果您的服务器上没有回购,那么您需要强制推送到服务器。这只会修复服务器上的引用,但它可能无法回收任何磁盘空间。您也需要在服务器上过期/ gc。