我不小心在一个包含大量数据文件的git项目中运行commit
- 这些文件大小为几GB。
然后我尝试运行push origin master
。它压缩了所有内容(几分钟),然后尝试将其上传到服务器。我试了几次,但没有运气。它是一个免费的git服务器,所以推送不成功(可能是项目大小)。错误是:
压缩对象:100%(101/101),完成。错误:RPC失败; result = 55,HTTP code = 0致命:远程端意外挂断 书写对象:100%(101/101),5.55 GiB | 10.39 MiB / s,完成。总 101(delta 21),重复使用0(delta 0)致命:远程端挂断 意外致命:预期确定/错误,帮助者说 '0009 [ffefJMeysq / IJJ,RJ:V
{L<wܜ[G>@}"<}5
{&GT; ZQW \〜Q'
现在我已使用data
删除了有问题的git rm --cached -r data/
子目录,并且(为了安全起见)将其移至另一个目录。我重新git commit
,然后尝试做git push
- 但它仍然试图移动所有数据!
我会将整个项目推回到早期版本,但不幸的是,我在此期间一直在编辑其他文件。
你知道我告诉git的方法请忘记存在的数据目录吗?非常感谢你!
答案 0 :(得分:2)
在第一次提交时,您向存储库添加了data/
的提交。通过执行git rm -r data/
然后git commit
,您进行了第二次提交,删除了data/
。 git push
必须上传两次提交,因此无关紧要。
此外,git rm --cached
仅从索引中删除数据。我不认为您的第二次提交实际上删除了任何文件,但您可以使用git log --stat
检查它。
您需要使用交互式rebase重写历史记录。这不是重写历史记录,而是重写 new 历史记录。作为保险政策,首先将master
与git tag before_rebase
放在一起。然后,如果出现严重错误,您可以随时返回before_rebase
再试一次。
你告诉git你想用origin/master
重写历史回到git rebase -i origin/master
。然后你会得到一个像这样的编辑器:
pick 064f41f Some change
pick 1ca69c3 Some other change
pick 1fa8921 Remove data/
pick 984alkj Huge amounts of data/
pick 82adlkj Bug fix
只需删除代表违规提交的行,保存并退出编辑器即可。然后,Git会将每个剩余的更改重新应用于彼此之上。您可能会遇到冲突,像解决其他任何合并一样解决它们。
完成后,使用git log
检查更改实际上已消失。
现在你应该能够推动data/
完全脱离了历史。
答案 1 :(得分:1)
据我所知,您从存储库中删除了数据,然后提交了删除。因此,数据仍然存在于先前的提交中。
要删除数据,您可以使用交互式rebase(git rebase -i
)。例如,假设您的历史记录如下:
然后你可以运行git rebase -i HEAD~5
(5是你想以交互方式重新设置的提交数量)。这将打开一个编辑器。在此编辑器中,删除添加大数据文件的提交,并删除删除大数据文件的提交。保存文件并退出编辑器。然后Git会在没有这两个提交的情况下重建你的分支,所以它看起来像这样:
之后,git push不再发送数据了。
答案 2 :(得分:0)
如果违规数据子目录仍在您尝试提交的文件夹中,git将尝试提交它,无论您是否删除它。它只会将其视为新文件。
要修复此错误,您可以完全从提交中删除目录,也可以配置.gitignore
(有关.gitignore语法的一般说明,请参阅here。)