「'receive-pack' timed out on server.fatal: The remote end hung up unexpectedly」エラー

このページの内容

お困りですか?

アトラシアン コミュニティをご利用ください。

コミュニティに質問

症状

git push の後に次のメッセージが表示される。

git push origin --all
Counting objects: 9554, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5064/5064), done.
Writing objects: 100% (9554/9554), 2.79 GiB | 444.00 KiB/s, done.
Total 9554 (delta 4382), reused 9554 (delta 4382)
'receive-pack' timed out on server.fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly

 

原因

This is a large push (e.g. initial push of a very big repository) and Stash is timing out.

ソリューション

Git は、ソースファイルのようなテキストベースのコンテンツに関しては、非常に高速で効率的な SCM です。差分圧縮を使ってリポジトリの内容や履歴を効率的に圧縮するため、リポジトリがコンパクトになります。git リポジトリは、同等の Subversion リポジトリの半分、あるいはそれ以下のサイズになることがよくあります。この圧縮にはコストがかかります。特に大きなファイルの場合には、差分を計算するのに CPU とメモリを消費します。また、git が行う一貫性チェックの一部にも影響します。単純なオブジェクトを扱う代わりに、差分の連鎖を考慮しなければなりません。

コード リポジトリの場合、これは非常にうまく機能します。通常、変更とプッシュはかなり小さいため、差分圧縮によって追加されるオーバーヘッドはわずかです。その結果、クローン作成 (およびフェッチ) が高速化された小さなリポジトリが作成されます。残念ながら、これらの最適化により、git は大規模なバイナリ コンテンツを含むリポジトリにとっては理想的とは言えなくなります。差分縮と一貫性チェックのオーバーヘッドが非常に顕著になります。個々のオブジェクトが大きいため、git が使用する内部キャッシュは十分な大きさではないことが多く、git は常にディスクからオブジェクトを再読み取りする必要があるため、整合性チェックが完了するまでに時間がかかります。できることはいくつかありますが、それぞれに違ったトレードオフがあります。

オプション 1 - 最初のプッシュが確実に完了するように、プロセス タイムアウトを十分に大きく設定する

The initial push will be particularly slow. Subsequent pushes won't be nearly as bad, but will still be fairly slow. If you go with this option, set the process timeout large enough to be sure that the initial push will complete (set it to a day if you want). After the initial push completes, it'd be best to set it back to a lower value. The timeout is there purely as a safety mechanism to ensure that runaway processes get cleaned up, should they occur. To perform this action, tweak the following parameter plugin.stash-scm-git.backend.timeout.execution on Stash config properties.

オプション 2 -特定のファイル タイプを圧縮しないようにリポジトリを設定する

これにより、リポジトリ内の大きなバイナリ ファイルが圧縮されないため、プッシュが速くなります。ただし、リポジトリが大幅に大きくなり、クローニングに時間がかかります。また、そのリポジトリのすべてのローカル クローンを大きくするので、トレードオフになります。このオプションを試すには、リポジトリ (マスター上) に .gitattributes にファイルを追加してください。例として、次の .gitattributes ファイルは .psd ファイルの差分圧縮を無効にし、git がテキストによる差分を行わないように、ファイルをバイナリとしてマークします。

*.psd binary
*.psd -delta

Commit the file and have git repack the repository before pushing it to Stash (this will probably be slow):

git repack

オプション 3 -リポジトリから大きなオブジェクトを削除する

http://blogs.atlassian.com/2014/05/handle-big-repositories-git/ では、大きなオブジェクトを履歴から取り除いたり、リポジトリを複数のリポジトリに分割したり、git-annex などの git 拡張機能を使用して大きなバイナリー資産を管理したりするためのテクニックをいくつか紹介しています。

最終更新日 2018 年 11 月 2 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.