Githubへpushしようとした際に、
RPC failed; curl 55 SSL_write() returned SYSCALL, errno = 32
fatal: the remote end hung up unexpectedly
初めてのエラーで何が起きているのか分からず、とりあえず何が起きているのか知るためにググる。。
エラーの意味
一度に多数かつ大容量のファイルをpushしようとするとデータの受け手側でチャンクが発生し、メモリが足りないことから発生している。
自分の場合はここの時点で、かなりの違和感...
・ 今回発生したタスクでは、gemの追加も、大容量のファイルを扱う実装はしていない。
・ ブランチを分け、細かくコミットしてpushする事を意識していた
..なぜ??(とりあえず、解決方法を探す)
行ったこと①
「http.postBuffer」の設定を変更する。 (gitのhttp通信制限を増やしてみる)
$ git config --global http.postBuffer 524288000
結果: → ダメ
更に倍にしてみる..
$ git config --global http.postBuffer 1048576000
結果: → ダメ
行ったこと②
一度にpushせずに、コミットID毎に分けてpushしてみる。
$ git push <remotename> <commit SHA>:refs/heads/<new remote branch name>
結果: → ダメ
詰まり始めてきたので、現状を整理する。。
コミット数も少なく実装内容は大容量データではないのにpushできない。
どこかのタイミングでホームディレクトリでgit init を実行してしまった..とか?....汗
とりあえず、以下を実行してみる。
$ pwd
$ ls -a ~/.git
結果:
$ ls -a ~/.git
. HEAD description info refs
.. config hooks objects
・・・(汗)
今回のエラー原因は、git init
を浅い階層で実行してしまったことが原因。
それによって、おおよそ全てのファイルが Gitの管理下になってしまったことで,容量が大きすぎてプッシュできない(というよりプッシュしてはいけない)状態になっていた。
原因が分かったので、
浅い階層に作成してしまったGitローカルリポジトリがあることが、確認できたので次の2つの流れで作業する。
① 現状のGitの管理下を確認
② 浅い階層に作成してしまったGitローカルリポジトリを削除していく
【ここで確認しないといけないこと】
最新のGitHubのリポジトリを確認して、アプリ以外のファイルが入っているかどうかを確認する
アプリ以外のファイルが入っている → GitHubのリポジトリごと一旦削除しなければならない
アプリ以外のファイルが入っていない → ホームディレクトリのローカルリポジトリを削除する(GitHubのリポジトリは削除しなくていい)
$ rm -rf ~/.git (Gitローカルリポジトリを削除)
【ルートディレクトリやデスクトップの方も確認しておく】
$ ls -a /.git
$ ls -a ~/Desktop/.git
もし、ファイルが表示されるなら以下も実行する
$ rm -rf /.git
$ rm -rf ~/Desktop/.git
【何が起きていたか】
ホームディレクトリでgit init を実行した形跡があるということは,普段使用しているほぼ全てのファイルがGitの管理下に入っていたことになる。
つまり,その状況でプッシュに成功していた場合はリポジトリにアプリ以外の内容が入っている可能性がある。
【コミットの差分を確認】
$ git diff HEAD~ HEAD
【ローカルとGitHubのコミット履歴の違いを確認】
$ git log --oneline -5
$ git fetch
$ git log --oneline -5 origin/現在のブランチ名 (今回は "master")
次に、
【変更のあったファイルを確認】
下記コマンドで変更のあったファイルを確認できる。
(大量にファイルが表示されたり、アプリのファイル以外が含まれていた場合は,不要なコミットを削除する必要がある)
$ git diff --stat HEAD~ HEAD
$ git diff --stat HEAD~~ HEAD~
【個別のコミットを確認する場合】
$ git diff --stat コミットID HEAD
問題がありそうな差分がなさそうであれば、「浅い階層に作成してしまったGitローカルリポジトリを削除」
$ rm -rf /.git
$ rm -rf /Users/.git
$ rm -rf ~.git
$ rm -rf ~/Desktop/.git
$ git fetch
$ git rebase origin/master
# コンフリクトが起きた場合、次は実行しない
$ git diff --stat origin/master HEAD
ここまでやって、pushすると...
pushできました!! ^^
git init
は意外と危険なコマンド。
必ずカレントディレクトリを確認してから実行するようにします!(汗)
失敗からも学んでいかないとです.. ^^;
アドバイス頂けた、エンジニアの方には感謝します!
ありがとうございました!
参考サイト
Git公式ドキュメント
https://core-tech.jp/blog/article582/
https://bufferings.hatenablog.com/entry/2018/05/22/075014
https://stackoverflow.com/questions/6842687/the-remote-end-hung-up-unexpectedly-while-git-cloning