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.postBuffer524288000 に設定することで、最初の524288000バイトの後にのみリクエストがバッファリングを開始するように解決できます。

注:設定されていない場合、デフォルト値のhttp.postBuffer、1MiB が適用されます。
git config http.postBuffer 524288000