Git push经常因管道损坏而失败。有什么方法可以从头开始吗?

时间:2018-02-20 10:31:57

标签: git push broken-pipe

我在一个发展中国家,我正在努力继续在一个大型项目上工作,而我在这里。我目前正试图通过不可靠的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

我通常让它在一夜之间运行,我醒来后看到经过几次失败之后推动了。但是这一次,我已经尝试了好几天,并且推动只是因为破裂的管子而失败了。我认为我的承诺太大了,而且在断电和互联网丢失之间的几个小时内它都无法工作。

有没有办法以较小的增量推送我的提交?或者是否有一种方法可以从最后一根破裂的管道开始,这样我每次都不必重新开始?

1 个答案:

答案 0 :(得分:2)

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

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

你要做的就是做以下事情(假设你正在推动origin):

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

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

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

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