问题 Git错误:RPC失败; result = 22,HTTP代码= 404


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

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

我已经尝试过以下方法:

git config --global http.postBuffer 524288000

2995
2017-09-11 23:12


起源

HTTP 404是“找不到文件”,表示您的URL错误。你可以发布你想要推送的网址吗?您是否可以发布VSO的屏幕截图,并展开“克隆URL”标签? - Edward Thomson
您会这​​么认为,但如果您清除缓冲区覆盖,404会消失,您只会得到一个常规的挂起错误 - Slick86
由于git URL错误,我遇到了类似的错误: https://.../foo 代替 https://.../foo.git - Liviu Chircu


答案:


我只是遇到了一个非常类似的错误(这个答案是谷歌的最佳结果) - 解决方案是@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

成功了。

奇怪的是原始的URL没有 .git 在两台Linux机器和一台Windows桌面上取得了成功,但在第三台Linux机器上失败了。包含 .git 使它适用于所有机器。


12
2018-03-15 17:07





您的存储库可能很大,尝试以块的形式上传,例如使用GIT在历史记录中途恢复到新分支的一半,推送它,然后推送最新的提交。

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

我能够推动108.61 MiB,但不是144.64 MiB

希望这可以帮助。


2
2017-11-13 15:08





2016年6月更新: 根据 这一页

对Team Services的SSH身份验证Git repos目前处于私有预览状态

如果你能,我建议你切换到SSH身份验证,因为这应该完全避免这个问题。 (请注意,您可以串联使用HTTPS和SSH, 即使在同一台机器上。)

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


原帖:

正如@Oxymoron所提到的那样,问题是您的存储库太大了,或者更具体地说,您正试图一次性地推动太多。

什么?这没有意义!那不是什么 HTTP 404 代码是为了!

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

你可能已经碰到了这个并得到了这样的错误:

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

这可能是导致你做的原因 git config 你提到的命令。

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

  1. 确定一次推送多少次提交。我通常建议使用二进制搜索来确定您可以推送多少,但由于推送之间的等待时间,这可能很难。此外,许多repos具有非常大的第一次提交,或者之后的某些提交非常大。如果您知道此类提交,请尝试自行推送。如果你的repo足够小,那么一次只推送一个提交可能是最容易的。否则,尝试推送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,直到按下所有提交。

举个例子,考虑一下这个回购:

$ 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日志很干净,因为我花了很多时间学习如何 写好的提交消息,我总是 保持我的提交原子

别担心,完成后你仍然可以获得原始历史记录。

返回(更新)示例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

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

一般的想法是,你做一个互动的rebase(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计算它可以重用多少,以及需要上传多少。)如果你有兴趣了解它的工作原理,请查看 Git Internals文档的Packfiles部分,也许是在刷完之后 Git对象

我是否提到过Git很棒?


1
2018-05-18 18:26