-
パイプ破損エラー
git push
ssh_exchange_identification
エラーgit push
中にタイムアウト。git pull
git clone
over HTTP はtransfer closed with outstanding read data remaining
エラーで失敗します。
git のトラブルシューティング
Gitを使っていると、思い通りに動かないことがあります。 ここでは、Gitのトラブルシューティングと問題解決のヒントをいくつか紹介します。
パイプ破損エラーgit push
リモートリポジトリにプッシュしようとすると、’Broken pipe’ エラーが発生することがあります。 プッシュする際には、通常次のようなメッセージが表示されます:
Write failed: Broken pipe
fatal: The remote end hung up unexpectedly
このイシューを解決するには、以下の方法が考えられます。
gitのPOSTバッファ・サイズの増加
SSHではなく HTTP で Git を使っている場合は、Git の設定で POST バッファのサイズを大きくしてみましょう。
クローン作成中のエラー例:fatal: pack has bad object at offset XXXXXXXXX: inflate returned -5
ターミナルを開いて入力してください:
git config http.postBuffer 52428800
この値はバイト単位で指定されるため、上記の場合、バッファサイズは50MBに設定されています。 デフォルトは1MBです。
SSH設定の確認
SSH経由でプッシュする場合、まずSSHの設定を確認してください。 Broken pipe’エラーは、SSHの根本的な問題(認証など)によって引き起こされることがあります。 SSHのトラブルシューティングにある指示に従って、SSHが正しく設定されていることを確認してください。
クライアントかサーバー(GitLabの管理者でサーバーにアクセスできる場合)でSSHの’keep alive’を設定することでセッションのタイムアウトを防ぐ方法もあります。
クライアント側でSSHを設定するには:
-
UNIXでは、
~/.ssh/config
(ファイルが存在しない場合は作成)を編集し、追加または編集します:Host your-gitlab-instance-url.com ServerAliveInterval 60 ServerAliveCountMax 5
-
Windowsでは、PuTTYを使用している場合、セッションのプロパティに移動し、「接続」に移動し、「セッションをアクティブに保つためのヌルパケットの送信」の下にある「キープアライブ間の秒数(オフにするには0)」
60
に設定します。
サーバー側でSSHを設定するには、/etc/ssh/sshd_config
:
ClientAliveInterval 60
ClientAliveCountMax 5
経営git repack
pack-objects’ タイプのエラーも表示される場合は、リモートリポジトリにプッシュする前にgit repack
を実行してみてください:
git repack
git push
Git クライアントのアップグレード
古いバージョンの git (< 2.9), consider upgrading to >= 2.9 (Broken pipe when pushing to Gitrepository を参照)) を使っている場合は、次のようにしてください。
ssh_exchange_identification
エラー
SSH 経由で Git をプッシュまたはプルしようとすると、次のようなエラーが発生することがあります:
Please make sure you have the correct access rights
and the repository exists.
...
ssh_exchange_identification: read: Connection reset by peer
fatal: Could not read from remote repository.
あるいは
ssh_exchange_identification: Connection closed by remote host
fatal: The remote end hung up unexpectedly
このエラーは通常、SSH デーモンのMaxStartups
の値が SSH 接続を制限していることを示しています。 この設定は、SSH デーモンへの認証されていない同時接続の最大数を指定します。 すべての接続が最初は「認証されていない」ので、これは適切な認証情報 (SSH キー) を持つユーザーに影響します。 デフォルト値は10
です。
/etc/ssh/sshd_config
の値を追加または変更することで、GitLab サーバーのMaxStartups
を増やします:
MaxStartups 100:30:200
100:30:200
つまり、100 SSH セッションまでは無制限に許可され、それ以降は接続の 30% が切断されます。
設定が完了したら、SSHデーモンを再起動して変更を有効にします。
# Debian/Ubuntu
sudo systemctl restart ssh
# CentOS/RHEL
sudo service sshd restart
git push
中にタイムアウト。git pull
リポジトリからのプル/プッシュが50秒以上かかった場合、以下の例のように、実行されたオペレーション数とそれぞれの時間のログとともにタイムアウトがイシューされます:
remote: Running checks for branch: master
remote: Scanning for LFS objects... (153ms)
remote: Calculating new repository size... (cancelled after 729ms)
これを使って、どのオペレーションがうまくいっていないのかをさらに調査し、GitLabにサービスを改善するための情報を提供することができます。
git clone
over HTTP はtransfer closed with outstanding read data remaining
エラーで失敗します。
バッファサイズがリクエストで許可されているサイズより小さい場合、アクションは以下のようなエラーで失敗します:
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
これは、既存のhttp.postBuffer
の値をリポジトリサイズより大きくすることで解決できます。例えば、500Mのリポジトリをクローンする際にgit clone
が失敗する場合、http.postBuffer
を524288000
に設定することで、最初の524288000バイトの後にのみリクエストがバッファリングを開始するように解決できます。
http.postBuffer
、1MiB が適用されます。git config http.postBuffer 524288000