公開日:2020.05.18

git clone 時に出た 「the remote end hung up unexpectedly」に辛勝した話

テクログaws

どうも!エンジニア歴2年目に突入したわいです。

連投になって申し訳ないんですけど、先日ハマった沼から抜け出すために苦悩したことを備忘録として書き留めます。

ウダウダ書いていますが、結果だけ知りたい方はまとめまで読み飛ばしてください。

何が起きたか

開発環境を CodeCommit から git clone したときに、下記のエラーに阻まれた。(いろいろあって開発環境を消してしまった…)

FATAL ERROR: Remote side unexpectedly closed network connection
fatal: the remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

?1行目のエラーメッセージはなぜかコロコロ変わったりした。

開発環境がないので、このままだと仕事ができないとかなり焦り、先輩に相談。

>どうやら、リポジトリの容量がでかすぎるらしい

試しに、先輩にもcloneし直してもらうと、、成功した

あわよくばと思ったが、自力で解決するしかなくなった、、

正直、Git Extensions のぬるま湯に1年間浸かりつづけていたので、Git が全くわかっていない。

とりあえず、ガンガン試していく作戦に出た。

何を試したか

これらの記事を参考にさせていただきました。ありがとうございます。

https://stackoverflow.com/questions/6842687/the-remote-end-hung-up-unexpectedly-while-git-cloning

https://cithukyaw.wordpress.com/2014/09/08/fix-for-the-fatal-error-early-eof-on-git-clone/

https://qiita.com/cacahuatl/items/4d763e98f3934e3569ca

① 「http.postBuffer」の設定を変更する

git config --global http.postBuffer 524288000

>結果は変わらなかった?

さらに2倍にしてみる

git config --global http.postBuffer 1048576000

>結果は変わらなかった?

② 「core.compression」を設定する

https://git-scm.com/docs/git-config

git config --global core.compression 0

>結果は変わらなかった?

>設定値を -1, 9 と変えてみたが、結果は変わらなかった?

ssh接続のタイムアウトを設定する

「Remote side unexpectedly closed network connection」で検索すると、sshのタイムアウトっぽいことが出てきたので試してみた

~/.ssh/config

ServerAliveInterval 60
ServerAliveCountMax 3

>結果は変わらなかった?

一度にcloneする量を減らす(shallow clone)

git clone --depth 1 <my_repo_URI>

>結果は変わらなかった?

いくら調べても他の解決法が出てこないので、この時点で?かなり詰んだと思った

⑤ 有線接続に変える

在宅になってから、家の Wi-Fi で仕事をしていたことに先輩の一言で気づいた

clone中の「MiB/s」が2倍近く増えたが、、

>結果は変わらなかった?

>①~④のどれも結果は変わらなかった?

絶望の淵に立たされていたときに、一筋の光が差し込んだ

⑥ masterブランチよりも軽いブランチをcloneする

git clone -b <smaller_branch> <my_repo_URI>

>結果は変わらなかった?

一度にcloneする量を減らす(shallow clone)

git clone -b <smaller_branch> --depth 1 <my_repo_URI>

>clone成功!!

現在、<smaller_branch>の最新のコミットだけ取得している状態なので、<smaller_branch>の全履歴を取得

git fetch --unshallow

>またもや、同様のエラー?

コミット数を制限して少しずつ履歴を取得

git fetch --depth 8 # コミット数:8は任意

>?fetch成功!!

残りの履歴を取得

git fetch --unshallow

>?fetch成功!!

⑦ masterブランチを含め、他のブランチ情報を取得する

.git/config の<smaller_branch>を * に変更する

[remote "origin"]
    url = <my_repo_URI>
    fetch = +refs/heads/*:refs/remotes/origin/*

git fetch

>?fetch成功!!

これですべての履歴が取得できた

>やっとの思いで、開発環境が復活!!

まとめ

結局、必要だったコマンド。

git config --global http.postBuffer 524288000

git clone -b <smaller_branch> --depth 1 <my_repo_URI>

git fetch --depth 8

git fetch --unshallow

.git/config

[remote "origin"]
    url = <my_repo_URI>
    fetch = +refs/heads/*:refs/remotes/origin/*

git fetch

有線接続では以上のコマンドでcloneできた。

Wi-Fi の場合、最後の git fetch だけがうまくいかなかった。

>いきなり、* で fetch するのではなくて、別のブランチを一度 fetch して、再度 * で fetch したらいけた

うーん、Gitムズイ、、

そもそも、alpineでDocker環境を作ってたら、こんなことには、、

他にいい方法があれば教えてください!

以上、わいでした。

健闘を祈る!!

この記事を書いた人

わい

入社年2019年

出身地大阪

業務内容システム開発

特技または趣味芸人のラジオを聴く、ダイビング

わいの記事一覧へ

テクログに関する記事一覧