我们正在处理以下问题:
我们正在处理大约1.2 GB的数据。因为我们切换到另一种数据格式 忘记将新格式放入.gitignore。在我们注意到所有文件都已添加之后,我们将它们全部删除并提交,但为时已晚,现在我们无法再推送到服务器,因为它对于带宽来说太大了!
我们已经尝试了
sudo git filter-branch --tree-filter "rm -f *.nc" HEAD
但这不起作用!推送仍试图推动所有~3000个物体!那么我们怎么能继续下去,因为我们真的遇到麻烦,因为它们无法相互沟通。
答案 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。