撤消导致git push失败的提交

时间:2012-01-28 19:26:03

标签: git

我不小心在一个包含大量数据文件的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的方法请忘记存在的数据目录吗?非常感谢你!

3 个答案:

答案 0 :(得分:2)

在第一次提交时,您向存储库添加了data/的提交。通过执行git rm -r data/然后git commit,您进行了第二次提交,删除了data/git push必须上传两次提交,因此无关紧要。

此外,git rm --cached仅从索引中删除数据。我不认为您的第二次提交实际上删除了任何文件,但您可以使用git log --stat检查它。

您需要使用交互式rebase重写历史记录。这不是重写历史记录,而是重写 new 历史记录。作为保险政策,首先将mastergit 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)。例如,假设您的历史记录如下:

  • HEAD
  • 删除大型数据文件(此提交中没有其他更改!)
  • 您要保留的更改(1)
  • 您要保留的更改(2)
  • 添加大型数据文件(此提交中没有其他更改!)
  • 您要保留的更改(3)
  • ...

然后你可以运行git rebase -i HEAD~5(5是你想以交互方式重新设置的提交数量)。这将打开一个编辑器。在此编辑器中,删除添加大数据文件的提交,并删除删除大数据文件的提交。保存文件并退出编辑器。然后Git会在没有这两个提交的情况下重建你的分支,所以它看起来像这样:

  • HEAD
  • 您要保留的更改(1)
  • 您要保留的更改(2)
  • 您要保留的更改(3)
  • ...

之后,git push不再发送数据了。

答案 2 :(得分:0)

如果违规数据子目录仍在您尝试提交的文件夹中,git将尝试提交它,无论您是否删除它。它只会将其视为新文件。

要修复此错误,您可以完全从提交中删除目录,也可以配置.gitignore(有关.gitignore语法的一般说明,请参阅here。)