web-dev-qa-db-ja.com

git:リモートにプッシュするときに「パックのオブジェクトが不良です」

Raspberry Piに裸のgitリポジトリがあり、私だけが使用しています。今日それにプッシュすると、私はこのエラーメッセージを受け取りました:

Counting objects: 460, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (367/367), done.
remote: fatal: pack has bad object at offset 1641: inflate returned -5
error: pack-objects died of signal 13
error: failed to Push some refs to 'ssh://[email protected]/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'

ご覧のとおり、リポジトリにはssh経由でアクセスします。 (IPアドレスを変更しました。)

何度か試しましたが、同じエラーが発生しました(同じ番号でも)。次に、古いリポジトリのフォルダを削除し、同じ名前のフォルダを作成し、その中でgit init --bareを実行して、新しいリポジトリを作成することにしました。

今、私はそれにプッシュするとこのエラーが発生します:

Counting objects: 3129, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2265/2265), done.
remote: fatal: pack has bad object at offset 426983445: inflate returned -5
error: pack-objects died of signal 13
error: failed to Push some refs to 'ssh://[email protected]/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'

問題は何ですか?どうすればそれを再び機能させることができますか?

カーネル3.1964ビットLinuxマシンでgitバージョン1.9.1を実行します。


追加の出力で更新:

laptop-14-04:~/Documents Container$ GIT_TRACE=1 git Push --porcelain --progress --recurse-submodules=check Origin refs/heads/master:refs/heads/master
trace: built-in: git 'Push' '--porcelain' '--progress' '--recurse-submodules=check' 'Origin' 'refs/heads/master:refs/heads/master'
trace: run_command: 'ssh' '[email protected]' 'git-receive-pack '\''/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'\'''
[email protected]'s password: 
trace: run_command: 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
trace: exec: 'git' 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
trace: built-in: git 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
Counting objects: 3383, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2257/2257), done.
remote: fatal: pack has bad object at offset 426983770: inflate returned -5
error: pack-objects died of signal 13
error: failed to Push some refs to 'ssh://[email protected]/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'

laptop-14-04:~/Documents Container$ git count-objects -Hv
count: 0
size: 0 bytes
in-pack: 3452
packs: 1
size-pack: 13.03 GiB
Prune-packable: 0
garbage: 0
size-garbage: 0 bytes

laptop-14-04:~/Documents Container$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (3452/3452), done.
laptop-14-04:~/Documents Container$ git gc
Counting objects: 3452, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2254/2254), done.
Writing objects: 100% (3452/3452), done.
Total 3452 (delta 915), reused 3452 (delta 915)

laptop-14-04:~/Documents Container$ git Push --porcelain --progress --recurse-submodules=check Origin refs/heads/master:refs/heads/master
[email protected]'s password: 
Counting objects: 3383, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2257/2257), done.
remote: fatal: pack has bad object at offset 426983770: inflate returned -5
error: pack-objects died of signal 13
error: failed to Push some refs to 'ssh://[email protected]/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'

新しいOS(4.4.0-21-genericカーネルを実行するUbuntu 16.04 64ビット)をインストールしました。gitはバージョン2.7.4になりました。古いリポジトリを新しいシステムにコピーせず、代わりにその内容をコピーして新しいリポジトリを作成しました。さらに、Raspberry Piのリポジトリを削除し、新しい裸のリポジトリを作成しました。 SmartGitを使用して、ファイルをリポジトリに追加し、プッシュしようとしました。ただし、問題はまだ存在します。

Screenshot of SmartGit error dialog.


ベアリポジトリをローカルで作成し、それをリモートとして追加してからプッシュすると機能します。次に、リポジトリディレクトリをRaspberry Piに転送し、sshを介してリモートとして使用できます。したがって、この問題は、ネットワークを介して大量のデータ(または場合によっては大きなコミット)をプッシュする場合にのみ発生するようです。

3
UTF-8

_pack-objects_(man _git-pack-objects_)は信号13( 壊れたパイプ )で死亡しました。これは、gitがオブジェクトを膨張(解凍)できず、エラー(エラーコード-5は メモリ外または上書き/オーバーラップエラー を意味する可能性があります)。

説明

zlib manual によると、エラーは次のように定義されています。

_#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
_

ここで、_-5_は、進行が不可能であるか、出力バッファーに十分なスペースがなかった場合を意味します。

_Z_BUF_ERROR_進行が不可能な場合、または_Z_FINISH_が使用されているときに出力バッファーに十分なスペースがなかった場合。 _Z_BUF_ERROR_は致命的ではなく、inflate()を再度呼び出して、より多くの入力スペースとより多くの出力スペースを使用して、解凍を続行できることに注意してください。

これがzlib FAQで読むことができるものです:

電話をかける前に、_avail_in_と_avail_out_がゼロでないことを確認してください。パラメータflushを_Z_FINISH_に設定するときは、avail_outが保留中のすべての入力を処理できる十分な大きさであることも確認してください。 _Z_BUF_ERROR_は致命的ではないことに注意してください。deflate()またはinflate()の別の呼び出しは、より多くの入力または出力スペースで行うことができます。 _Z_BUF_ERROR_がゼロで戻ったときに保留中の出力があるかどうかを判断できないため、関数の使用方法によっては、実際には_strm.avail_out_が避けられない場合があります。注釈の多い例については、 zlibの使用例 を参照してください。


解決

これはいくつかのことに関連している可能性があります。

  • プッシュされるオブジェクトが大きすぎるため、zlibはメモリであるため、出力zlibバッファにさらに多くのスペースが必要です。

    この場合、増加してみてください _http.postBuffer_ 、例:.

    _git config http.postBuffer 134217728 # =~ 128MB
    _

    または、 bfg を使用して、より大きなブロブを削除します。

    _Java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
    _
  • オブジェクトが破損しているため、_git fsck --full_および_git gc_を実行します

    考えられる理由は、メモリまたはストレージデバイスが破損している可能性があるため、クリーンなリポジトリまたは別のコンピュータで再試行してください。

  • _Z_BUF_ERROR_で中止すべきではないため、gitのバグである可能性がありますが、より多くの出力スペースまたはより多くの入力を提供するには、以下を参照してください。 zLib inflate()がバッファの解凍中にハングする

    あなたは報告するかもしれません メーリングリストへのgitバグ報告

  • gzip inflateがそれ自体を発行している可能性があります(例: これはこのgzipinflateメソッドのバグですか?

  • 古いカーネルのバグ(<= 2.6.32-rc4)である可能性があるため、カーネルをアップグレードしてください

    参照: Bug#547503:git-core: "git clone" failed on armel

    私が見つけた唯一の関連するカーネルの変更はコミットでした _5a3a29f_ (ARM:5691/1:kmap()とkmap_atomic()の間のキャッシュエイリアシングの問題を highmem で修正=、commit _7929eb9_ アップストリーム)2.6.31.1から。ですから、私にも疑問がありますが、私たち幸運でした。msg00049


考慮すべきその他の便利なコマンド:


参照:


関連するGitコードが失敗しています( _builtin/index-pack.c_ ):

_git_inflate_init(&stream);
stream.next_out = buf;
stream.avail_out = buf == fixed_buf ? sizeof(fixed_buf) : size;

do {
    unsigned char *last_out = stream.next_out;
    stream.next_in = fill(1);
    stream.avail_in = input_len;
    status = git_inflate(&stream, 0);
    use(input_len - stream.avail_in);
    if (sha1)
        git_SHA1_Update(&c, last_out, stream.next_out - last_out);
    if (buf == fixed_buf) {
        stream.next_out = buf;
        stream.avail_out = sizeof(fixed_buf);
    }
} while (status == Z_OK);
if (stream.total_out != size || status != Z_STREAM_END)
    bad_object(offset, _("inflate returned %d"), status);
git_inflate_end(&stream);
_

および git_inflate() from zlib.c

_status = inflate(&strm->z,
         (strm->z.avail_in != strm->avail_in)
         ? 0 : flush);
_
2
kenorb