【问题标题】:Git error: RPC failed; result=22, HTTP code = 404Git错误:RPC失败;结果 = 22,HTTP 代码 = 404
【发布时间】:2015-09-11 23:12:25
【问题描述】:

我在 OSX 上使用 SourceTree 并使用 Git 推送到 Visual Studio Online。我收到以下错误:

POST git-receive-pack(490857233 字节)
错误:RPC 失败;结果 = 22,HTTP 代码 = 404
致命:远端意外挂断
一切都是最新的
完成但有错误,见上文

我已经尝试了以下方法:

git config --global http.postBuffer 524288000

【问题讨论】:

  • HTTP 404 是“找不到文件”,表示您的 URL 错误。您可以发布您要推送到的 URL 吗?您能否发布 VSO 的屏幕截图,并展开“克隆 URL”选项卡?
  • 你会这么认为,但如果你清除缓冲区覆盖,404 就会消失,你只会得到一个常规的挂断错误
  • 由于 git URL 错误,我遇到了类似的错误:https://.../foo 而不是 https://.../foo.git
  • 对于 GitLab,这是一个报告的错误 gitlab.com/gitlab-org/gitlab/issues/29629 --- 添加 .git 的解决方法。

标签: git atlassian-sourcetree azure-devops


【解决方案1】:

我刚刚遇到了一个非常相似的错误(这个答案是谷歌的最高结果) - 解决方案在 @Liviu Chircu 的评论中

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

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机器上失败了。包含.git 使其适用于所有机器。

【讨论】:

  • 这个答案解决了我的问题。 git config --global http.postBuffer 524288000 不起作用。
  • 对我来说也是一样的,在服务器 Gitlab 11.11.5-ee 上。添加 .git 有帮助。
  • 我在 CentOS 7 上遇到了这个问题。在 URL 末尾添加.git 解决了我的问题。
  • 这成功了!应该被接受的解决方案。谢谢
【解决方案2】:

我刚刚在克隆 git URL 的末尾添加了 .git 。它的工作原理

【讨论】:

    【解决方案3】:

    您的存储库可能很大,请尝试分块上传,例如使用 GIT 在历史记录的一半左右还原到新分支,然后推送,然后推送最新的提交。

    可能是更好的解决方法,但这是我能够快速解决问题的方法

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

    希望这会有所帮助。

    【讨论】:

    • 我在一个小型存储库中遇到了同样的问题
    【解决方案4】:

    2016 年 6 月更新: 根据this page

    对 Team Services Git 存储库的 SSH 身份验证目前处于私人预览阶段

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

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


    原帖:

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

    什么?那没有意义!这不是HTTP 404 代码的用途!

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

    你可能已经遇到过这样的错误:

    Unable to rewind rpc post data - try increasing http.postBuffer
    

    这很可能是导致您执行您提到的git config 命令的原因。

    现在,出于我发布单独答案的目的:我想详细说明如何解决此问题。您仍然会尝试一次推送一组较小的提交,但这并不总是像听起来那么容易。流程如下:

    1. 确定一次推送多少次提交。我通常会推荐一个二分搜索来确定你可以推送多少,但这可能很困难,因为推送之间的等待时间。此外,许多 repos 的第一次提交非常大,或者之后的某些提交非常大。如果您知道此类提交,请尝试自行推送。如果你的仓库足够小,一次只推送一个提交可能是最简单的。否则,尝试推送 20-30 次提交,如果遇到问题,请减少数量。

    2. 假设你有一个分支master,在同一个地方创建一个新分支,例如master-temp

    3. master 重置为您要推送的第一个组中的最后一个提交。例如。 git reset --hard master-temp~100.

    4. 推送该提交 (git push)。

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

    6. 重复第 4 步和第 5 步,直到推送所有提交。

    例如,考虑这个 repo:

    $ 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 日志很好而且很干净,因为我花了很多时间学习如何write great commit messages,而且我总是keep my commits atomic

    别担心,完成后您仍会获得原始历史记录。

    返回(更新的)示例 repo:

    * 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
    

    (大规模提交可以在任何地方,也可以有多个。)

    一般的想法是,您对split the massive commit into a few smaller ones 进行交互式变基 (git rebase -i)。

    $ git checkout -b master-temp master
    $ git rebase -i --root
    

    注意:--root 仅在您需要拆分第一个提交时才需要。否则,例如git rebase -i bbbbbbb.

    将要拆分的提交从 pick 更改为 edit

    $ 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
    

    现在这就是 magit 魔法发生的地方:

    $ 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 足够聪明,可以重用您已经推送的项目,即使它们在不同的提交中。 (请注意,Analyzing objects 步骤耗时最长。这是 Git 计算可以重用多少以及需要上传多少。)如果您有兴趣了解有关其工作原理的更多信息,请查看Packfiles section of the Git Internals docs,也许是在刷完Git Objects之后。

    我有没有提到 Git 很棒?

    【讨论】:

      【解决方案5】:

      “奇怪的是,原来不带 .git 的 URL 在两台 linux 机器和一个 windows 桌面上成功了,但是在第三台 linux 机器上却失败了。包括 .git 使它可以在所有机器上运行。”

      可能是git版本太旧

      【讨论】:

        猜你喜欢
        • 2012-11-07
        • 2014-05-17
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 2013-10-27
        • 2012-09-21
        • 2014-12-22
        相关资源
        最近更新 更多