Ошибка Git: сбой RPC; результат =22, код HTTP = 404

Я использую SourceTree на OSX и использую Git для перехода на Visual Studio Online. Я получаю следующую ошибку:

POST git-receive-pack (490857233 байта)
ошибка: сбой RPC; результат =22, код HTTP = 404
фатальный: удаленный конец неожиданно завис
Все современно
Завершено с ошибками, см. Выше

Я уже пробовал следующее:

git config --global http.postBuffer 524288000

3 ответа

Я только что столкнулся с очень похожей ошибкой (для которой этот ответ является лучшим результатом Google) - решение было в комментарии @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

удалось.

Странно то, что оригинальный URL без .git удалось на двух машинах Linux и рабочем столе Windows, но не удалось на третьей машине Linux. В том числе .git заставляет его работать на всех машинах.

Я только что добавил.git в конец URL-адреса git во время клонирования. Это сработало

Обновление за июнь 2016: По данным этой страницы:

Аутентификация SSH для репозиториев Team Services Git в настоящее время находится в режиме предварительного просмотра

Я рекомендую вам переключиться на аутентификацию SSH, если вы можете, потому что это должно полностью избежать этой проблемы. (Обратите внимание, что вы можете использовать HTTPS и SSH одновременно, даже на одном компьютере.)

Если это еще не было включено или вы по-другому не можете переключиться на SSH, продолжайте чтение.


Исходное сообщение:

Как упомянул @Oxymoron, проблема в том, что ваш репозиторий слишком велик, или, точнее, вы пытаетесь выдвинуть слишком много за один раз.

Какие? Это не имеет смысла! Это не то, что HTTP 404 код для!

Это также не имеет смысла для меня. * смотрит в общем направлении Microsoft *

Вы, вероятно, уже столкнулись с этим и получили ошибку, подобную этой:

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

И это, вероятно, то, что заставило вас сделать git config Команда, которую вы упомянули.

Теперь для того, чтобы опубликовать отдельный ответ: я хотел бы подробнее рассказать о том, как вы можете это исправить. Вы по-прежнему будете пытаться выдвигать меньший набор коммитов за раз, но это не всегда так просто, как кажется. Вот процесс:

  1. Определите, сколько коммитов нажать одновременно. Обычно я бы рекомендовал двоичный поиск, чтобы определить, сколько вы можете нажать, но это может быть сложно из-за времени ожидания между нажатиями. Кроме того, многие репо имеют очень большой первый коммит, или некоторые коммиты после этого очень велики. Если вы знаете о таких коммитах, попробуйте их подтолкнуть сами. Если ваш репо достаточно мал, может быть проще всего нажать один коммит за раз. В противном случае, попытайтесь подтолкнуть 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 хорош и чист, потому что я потратил много времени на изучение того, как писать отличные коммит-сообщения, и я всегда держу свои коммиты на атомном уровне.

Не волнуйтесь, вы все равно получите свою оригинальную историю, когда закончите.

Вернуться к (обновленному) примеру репо:

* 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

(Массивный коммит может быть где угодно или может быть больше одного.)

Общая идея заключается в том, что вы делаете интерактивный ребаз (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

Теперь здесь происходит магия магии:

$ 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 документации Git Internals, возможно, после прояснения объектов Git.

Я уже говорил, что Git - это круто?

Ваш репозиторий может быть слишком большим, попробуйте загружать порциями, например, используя GIT для возврата назад на полпути в истории или около того, в новую ветку, нажмите это, а затем нажмите последние коммиты.

Возможно, лучший обходной путь, но это то, что я смог сделать, чтобы быстро решить мою проблему

Я смог толкнуть 108,61 МиБ, но не 144,64 МиБ

Надеюсь это поможет.

"Странно то, что исходный URL без.git успешно работал на двух Linux-машинах и на рабочем столе Windows, но не работал на третьей Linux-машине. Включая.git, он работает на всех машинах ".

Возможно, версия git слишком старая

Другие вопросы по тегам