Git错误:RPC失败;结果=22,HTTP代码=404

Git错误:RPC失败;结果=22,HTTP代码=404,git,atlassian-sourcetree,azure-devops,Git,Atlassian Sourcetree,Azure Devops,我在OSX上使用SourceTree,并使用Git推送到VisualStudioOnline。我得到以下错误: POST git接收包(490857233字节) 错误:RPC失败;结果=22,HTTP代码=404 致命:远程端意外挂起 一切都是最新的 已完成,但有错误,请参见上文 我已经尝试了以下方法: git config --global http.postBuffer 524288000 你的存储库可能太大了,试着分块上传,比如在一个新的分支中使用GIT将历史还原到一半左右,推送它,然后

我在OSX上使用SourceTree,并使用Git推送到VisualStudioOnline。我得到以下错误:

POST git接收包(490857233字节)
错误:RPC失败;结果=22,HTTP代码=404
致命:远程端意外挂起
一切都是最新的
已完成,但有错误,请参见上文

我已经尝试了以下方法:

git config --global http.postBuffer 524288000

你的存储库可能太大了,试着分块上传,比如在一个新的分支中使用GIT将历史还原到一半左右,推送它,然后推送最新的提交

也许是一个更好的解决办法,但这就是我能够快速解决问题的方法

我能够推送108.61 MiB,但不能推送144.64 MiB


希望这有帮助。

2016年6月更新:根据:

Team Services Git repos的SSH身份验证当前处于私有预览中

如果可以的话,我建议您切换到SSH身份验证,因为这样可以完全避免这个问题。(请注意,您可以同时使用HTTPS和SSH。)

如果尚未为您启用此功能,或者您无法切换到SSH,请继续阅读


原创帖子:

正如@Oxymoron提到的,问题在于您的存储库太大,或者更具体地说,您试图一次推送太多

什么?那没有道理!这不是HTTP 404的代码

这对我来说也没有意义*微软的大方向*

您可能已经遇到了这样的问题,并出现了如下错误:

Unable to rewind rpc post data - try increasing http.postBuffer
这可能就是导致您执行您提到的
git config
命令的原因

现在,为了我发布一个单独的答案:我想进一步说明如何解决这个问题。您仍将尝试一次推送一组较小的提交,但这并不总是像听起来那么容易。过程如下:

  • 确定一次要推送的提交数。我通常会建议使用二进制搜索来确定可以推送的量,但这可能很困难,因为推送之间需要等待时间。此外,许多回购协议的首次提交量非常大,或之后的某些提交量非常大。如果你知道这样的承诺,试着自己推动。如果您的回购协议足够小,那么一次只推一次提交可能是最简单的。否则,尝试推送20-30次提交,如果遇到问题,则减少提交次数

  • 假设您有一个分支,
    master
    ,则在同一位置创建一个新分支,例如
    master temp

  • master
    重置为要推送的第一个组中的最后一次提交。例如,
    git复位——硬主温度~100

  • 推送提交(
    git-Push

  • 在下一组的最后一次提交时执行
    --ff
    合并。(
    git merge--ff only master temp~90

  • 重复步骤4和5,直到推送所有提交

  • 作为一个例子,考虑这个回购:

    $ git log --oneline --decorate
    * fffffff (HEAD -> master) Commit six
    * eeeeeee Commit five
    * ddddddd Commit four
    * ccccccc Commit three
    * bbbbbbb Commit two
    * aaaaaaa Commit one
    
    这是您将要做的,假设您希望一次推送一个提交:

    $ git checkout -b master-temp master
    $ git checkout master
    $ git reset --hard aaaaaaa
    $ git push origin master
    $ git merge --ff-only bbbbbbb
    $ git push origin master
    $ git merge --ff-only ccccccc
    $ git push origin master
    $ git merge --ff-only ddddddd
    $ git push origin master
    $ git merge --ff-only eeeeeee
    $ git push origin master
    $ git merge --ff-only fffffff
    $ git push origin master
    
    理想情况下,这样做很好,你就完成了。但是,如果给定的提交不能被推送,即使这是您正在推送的唯一提交,会发生什么呢?首先,试着再推一两次;推动失败的代价似乎有些不一致

    如果它仍然无法推动,那么是时候重写历史了

    但我不想重写我的历史!我的Git日志很好,很干净,因为我花了很多时间学习如何使用它,而且我总是这样

    别担心,完成后你仍然会得到你的原始历史

    回到(更新的)回购示例:

    * fffffff (HEAD -> master) Tiny commit five
    * eeeeeee Tiny commit four
    * ddddddd Tiny commit three
    * ccccccc Tiny commit two
    * bbbbbbb Tiny commit one
    * aaaaaaa This commit is massive
    
    (大规模提交可以在任何地方,也可以有多个。)

    一般的想法是,您可以执行一个交互式的rebase(
    git-rebase-i
    )来

    注意:只有在需要拆分第一次提交时才需要
    --root
    。否则请执行,例如,
    git rebase-i bbbbb

    将要拆分的提交从
    拾取
    更改为
    编辑

    $ git reset HEAD^
    $ git add somefiles
    $ git commit
    $ git push origin master-temp
    $ git add someotherfiles
    $ git commit
    $ git push origin master-temp
    $ git rebase --continue
    $ git push origin master-temp
    
    这就是神奇发生的地方:

    $ git checkout master
    switched to branch 'master'
    $ git push origin master
    POST git-receive-packed (chunked)
    remote: Analyzing objects... (1212/1212) (2518523 ms)
    remote: Storing packfile... done (48186 ms)
    remote: Storing index... done (228 ms)
    Pushing to https://example.visualstudio.com/SomeCollection/SomeTeam/_git/MyRepo
    To https://example.visualstudio.com/SomeCollection/SomeTeam/_git/MyRepo
     * [new branch]    master -> master
    updating local tracking ref 'refs/remotes/origin/master'
    
    最后一个命令将成功,因为Git足够聪明,可以重用您已经推送的项,即使它们位于不同的提交中。(请注意,
    分析对象
    步骤花费的时间最长。这是Git计算它可以重用多少以及需要上传多少。)如果您有兴趣了解更多这方面的工作原理,请查看,也许在复习之后


    我有没有提到Git非常棒?

    我刚刚遇到了一个非常类似的错误(这个答案是谷歌的头条搜索结果)——解决方案出现在@Liviu Chircu的评论中

    解决方案是将
    .git
    放在url的末尾

    git clone http://myURL/projectname
    Cloning into 'projectname'...
    error: RPC failed; result=22, HTTP code = 404
    fatal: The remote end hung up unexpectedly
    
    然而:

    git clone http://myURL/projectname.git
    
    成功了


    奇怪的是,没有
    .git
    的原始URL在两台linux机器和一台windows桌面上成功,但在第三台linux机器上失败。include
    .git
    使它在所有机器上都能工作。

    奇怪的是,没有.git的原始URL在两台linux机器和一台windows桌面上成功,但在第三台linux机器上失败。include.git使它在所有机器上都能工作


    可能是git版本太旧了

    我刚刚在克隆时在git URL的末尾添加了.git。它工作正常

    HTTP 404是“找不到文件”,表明您的URL错误。你能发布你想要推到的URL吗?你能发布一个VSO的屏幕截图,并扩展“克隆URL”选项卡吗?你会这么想,但如果你清除缓冲区覆盖,404就会消失,你只会得到一个常规的hungup错误。我遇到了一个类似的错误,因为git URL不正确:
    https://.../foo
    而不是
    https://.../foo.git
    GitLab的可能副本
    git clone http://myURL/projectname.git