【问题标题】:Git push frequently fails with broken pipe. Any way to not start over from the beginning?Git push 经常因管道损坏而失败。有什么办法不从头再来吗?
【发布时间】:2018-02-20 10:31:56
【问题描述】:

我在一个发展中国家,我在此期间正在努力继续从事一个大型项目。我目前正在尝试通过不可靠的 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 bundle 在不可靠互联网系统上构建一个捆绑文件(大致相当于git push 将发送的内容),然后使用一些可重新启动的传输(ftp、curl 等)来发送捆绑包。一旦你有了可靠的捆绑包,你就可以在上面运行git fetch

标签: git push broken-pipe


【解决方案1】:

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

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

您要这样做的方法是执行以下操作(假设您要推送到origin):

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2017-08-28
    • 2011-07-13
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多