まずまとめ
- もともとGitで管理していなかった既存プロジェクトの改修のため、Gitリポジトリをローカルに作成し、プロジェクトデータを全てcommitした。ローカルへのcommitは成功したが、いざGitHubへpushしようとすると下記のエラーが発生して失敗してしまった。
error: RPC failed; curl 55 SSL_write() returned SYSCALL, errno = 32
fatal: The remote end hung up unexpectedly
- 結論から言うと、原因は一度に多数かつ大容量のファイルをpushしようとするとデータの受け手側でチャンクが発生し、この際にメモリが足りなくなってしまうことだった。
- 解決策としては、手動で何度かのコミットに分けてpushすれば無事にpushできる。
状況
症状
冒頭でも述べたが、SourceTreeからpushすると下記のメッセージが出てエラー終了。
error: RPC failed; curl 55 SSL_write() returned SYSCALL, errno = 32
fatal: The remote end hung up unexpectedly
アップするデータが全体で5GB程度あるため、チャンク処理が行われる際にデータの受け手側でメモリが足りなくなることが原因ではないかと思われる。じゃあ一度にチャンク処理を行うデータ量を減らしてあげないとやばいよねと言う推定。
Git環境
- SourceTree
- GitLFSインストール済み(単体で150MB以上容量があるファイルをGitHubにpushするソフト)
- SSH通信
- git config --global ssh.postBuffer 524288000に変更済み(この値が小さいとより小さな容量でもチャンクが発生してしまう可能性があるかも?未調査。)
ファイル
- Unityプロジェクト
- 単体で150MB以上のファイルはない
- 数MB程度のpsdファイルがいくつか存在
- プロジェクト全体で5GB程度
このエラーに特徴的なメッセージ
pushしている最中に詳細を表示すると下記のような表示が出ている。
最後の行でチャンクが発生していることがわかるが、これはpushするデータが小さい場合は表示されない特徴的なメッセージ。表示されたらメモリ容量的にかなり苦しい処理を行っているものと推定できる。ただし、このメッセージが表示されたらpush失敗すると言うわけではなく、メモリを食いつぶし切らなければ大丈夫な様子。(逆に今回のエラーが発生しているときは必ずチャンクが発生している。)
解決策
1.コミットの際に一度にステージするファイル数を減らし、一回のコミットが全体で数10MB程度になるようにする。
2.コミットの都度pushする(これは必要ないかも)
※SourceTreeは2MB以上のファイルを上げようとすると警告を出してくるが、これは無視してOK。
終わりに
普通にGitにはコミットできたのにpushだけできないので超焦りました・・・