Git 推送经常因管道破裂而失败。有什么办法不从头开始?

Git push frequently fails with broken pipe. Any way to not start over from the beginning?

我在一个发展中国家,我想在我在这里的时候继续从事一个大型项目。我目前正在尝试通过不可靠的 100 kbps 连接推送大约 10 GB 的更改。我不知道到底出了什么问题,但我无法完成推送,现在已经结束了几次,并出现此错误:

fatal: The remote end hung up unexpectedly
fatal: sha1 file '<stdout>' write error: Broken pipe

过去有几次我能够使用此命令推送我的更改:

while ! git push; do sleep 30; done

我通常让那个 运行 过夜,我醒来时发现在几次失败后推送成功了。但这一次,我已经尝试了好几天了,但由于管道破裂,推动一直失败。我认为我的承诺太大了,而且在断电和网络中断之间的几个小时内它不会工作。

有没有办法以更小的增量推送我的提交?或者有没有一种方法可以从上次发生管道破裂的地方开始,这样我就不必每次都从头开始?

Git 没有任何可恢复推送的代码。

如果您的更改由多个提交组成,您可以创建一个包含一些提交的临时分支并推送它。然后你可以推送包含更多提交的同一分支的新版本,等等。 Git 根据可用的提交知道远程端有哪些对象,因此它将避免再次发送这些对象。

你的方法是做类似下面的事情(假设你要推送到 origin):

$ git log # find some early commit; call it COMMIT_ID
$ git push origin COMMIT_ID:temp

然后稍晚一些提交重复。只要某个分支仍然可以访问提交,Git 就会知道远程服务器具有该提交及其所依赖的对象。

完成后,您可以像往常一样推送主分支并使用 git push origin :temp 清理临时分支。

如果您只有一个大型提交,您可以尝试创建较小的临时提交,其中仅包含对其中一些文件的完整更改,推送这些文件,然后再次尝试进行更多更改。不过,这可能有效也可能无效。