Git灾难:1.2GB隐藏在.Git中

Git灾难:1.2GB隐藏在.Git中,git,github,Git,Github,我们正在处理以下问题: 我们正在处理大约1.2GB的数据。因为我们切换到了另一种数据格式 忘记将新格式放入.gitignore。在我们注意到所有的文件都被添加后,我们将它们全部删除并提交,但为时已晚,现在我们无法再推送到服务器,因为它对于带宽来说太大了 我们已经试过了 sudo git filter-branch --tree-filter "rm -f *.nc" HEAD 但这是行不通的!推送仍然尝试推送所有~3000个对象!既然彼此之间无法通信,我们真的遇到了麻烦,那么我们该如何继续呢

我们正在处理以下问题:

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

我们已经试过了

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

但这是行不通的!推送仍然尝试推送所有~3000个对象!既然彼此之间无法通信,我们真的遇到了麻烦,那么我们该如何继续呢。

是的,
git filter branch
是一条路要走

但是,由于您要更改历史记录,您可以挤出历史记录中有问题的部分,然后像我最近解释的那样,选择后面的好提交

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


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

首先确定要处理多少个有问题的提交。Filter branch功能强大,但使用起来也很混乱,语法也很奇怪。对我来说,如果问题提交的数量是链接和参考,尽管这里似乎发生了其他事情。你能为你的提交历史和问题绘制一个ascii图吗?这样,理解问题和回答问题就容易多了。您不能通过删除该文件来进行提交吗
git rm BIGFILE
并推送它?@ProblemFactory将BIGFILE保留在较旧的提交中,在签出较新的提交时节省空间,但仍占用存储库本身的空间。根据他的描述,这听起来可能会丢失数据-只有在错误的提交添加了*.nc文件而没有其他文件时,这才有效,但情况可能并非如此。此外,您还需要在服务器上触发gc。@AndrewC,我认为这取决于OP会选择重做的历史记录的哪一部分,以及“挤压”是如何完成的,如果只保留错误添加的文件,那么一切都是好的。用户还可以创建标记或依靠
git reflog
返回并重新启动整个过程。这取决于用户是否只提交构建输出。通常人们不会这样做。当然,这是可能发生的,但并不典型。
git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --prune=now