git: "paket memiliki objek buruk" ketika mendorong ke remote


3

Saya memiliki repositori telanjang di Raspberry Pi saya yang hanya saya gunakan. Saat mendorongnya hari ini, saya menerima pesan kesalahan ini:

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://christoph@111.111.111.111/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'

Seperti yang Anda lihat, repositori diakses melalui ssh. (Saya mengubah alamat IP.)

Saya mencoba beberapa kali tetapi mendapat kesalahan yang sama (bahkan dengan nomor yang sama). Kemudian saya memutuskan untuk membuat repositori baru dengan menghapus folder yang lama, membuat folder dengan nama yang sama, dan mengeksekusi git init --baredi dalamnya.

Sekarang saya mendapatkan kesalahan ini ketika mendorongnya:

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://christoph@111.111.111.111/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'

Apa masalahnya dan bagaimana saya membuatnya bekerja lagi?

Saya menjalankan git versi 1.9.1 pada kernel 3.19 mesin 64 bit Linux.


Memperbarui dengan output tambahan:

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' 'christoph@111.111.111.111' 'git-receive-pack '\''/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'\'''
christoph@111.111.111.111'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://christoph@111.111.111.111/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
christoph@111.111.111.111'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://christoph@111.111.111.111/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'

Saya sekarang menginstal OS baru (Ubuntu 16.04 64 bit menjalankan kernel 4.4.0-21-generik) dan git sekarang versi 2.7.4. Saya tidak menyalin repo lama ke sistem baru tetapi sebaliknya hanya menyalin kontennya dan membuat repo baru. Selanjutnya saya menghapus repo pada Raspberry Pi saya dan membuat repo telanjang baru di atasnya. Saya sekarang menggunakan SmartGit untuk menambahkan file ke repo dan untuk mencoba mendorongnya. Namun, masalahnya masih ada:

Cuplikan layar dialog kesalahan SmartGit.


Ini berfungsi jika saya membuat repositori telanjang secara lokal, menambahkannya sebagai remote, dan kemudian mendorongnya. Saya kemudian dapat mentransfer direktori repositori ke Raspberry Pi dan menggunakannya sebagai remote via ssh. Jadi sepertinya masalah hanya terjadi ketika mendorong banyak data (atau mungkin komitmen besar) melalui jaringan.


sepertinya repositori lokal Anda rusak ...
Jakuje

Bisakah kamu berlari git fsck --fulldan git gc? Apakah ini membantu? Lakukan juga fsckpada perangkat penyimpanan Raspberry Anda dan lakukan beberapa pengujian memori. Coba jalankan perintah berikut dengan GIT_TRACE=1.
kenorb

1
Apa versi git Anda? Seberapa besar file paket Anda ( du -hs .git/objects/pack)? Apakah Anda menggunakan semacam VPN atau proxy?
kenorb

Saya menjalankan perintah tetapi tidak tahu ke mana harus menempatkan GIT_TRACE=1.
UTF-8

Jawaban:


2

The pack-objects(man git-pack-objects) mati karena sinyal 13 ( pipa rusak ), karena gittidak dapat mengembang (uncompress) objek dan gagal dengan kesalahan (kode kesalahan -5 bisa berarti out-of-mem atau menimpa / tumpang tindih kesalahan ).

Penjelasan

Menurut manual zlib , kesalahan didefinisikan sebagai berikut:

#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)

di mana -5berarti tidak ada kemajuan yang mungkin terjadi atau jika tidak ada cukup ruang di buffer output.

Z_BUF_ERRORjika tidak ada kemajuan yang mungkin terjadi atau jika tidak ada cukup ruang di buffer output saat Z_FINISHdigunakan. Catatan yang Z_BUF_ERRORtidak fatal, dan inflate()dapat dipanggil lagi dengan lebih banyak input dan lebih banyak ruang output untuk melanjutkan dekompresi.

Inilah yang bisa kita baca di FAQ zlib :

Sebelum melakukan panggilan, pastikan itu avail_indan avail_outbukan nol. Saat menetapkan parameter rata sama dengan Z_FINISH, pastikan juga avail_out cukup besar untuk memungkinkan pemrosesan semua input yang tertunda. Perhatikan bahwa a Z_BUF_ERRORtidak fatal - panggilan lain untuk mengempis () atau mengembang () dapat dibuat dengan lebih banyak ruang input atau output. A Z_BUF_ERRORmungkin sebenarnya tidak dapat dihindari tergantung pada bagaimana fungsi digunakan, karena tidak mungkin untuk mengetahui apakah ada lebih banyak output yang tertunda ketika strm.avail_outkembali dengan nol. Lihat Contoh Penggunaan zlib untuk contoh beranotasi berat.


Larutan

Ini mungkin terkait dengan beberapa hal:

  • objek yang didorong terlalu besar sehingga zlib adalah memori, jadi Anda perlu lebih banyak ruang dalam buffer output zlib,

    Dalam hal ini, coba tambah http.postBuffer, mis

    git config http.postBuffer 134217728 # =~ 128MB
    

    Atau gunakan bfguntuk menghapus gumpalan yang lebih besar, misalnya

    java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
    
  • objek Anda rusak, jadi jalankan git fsck --fulldangit gc

    Alasan potensial bisa jadi memori rusak atau perangkat penyimpanan, jadi coba lagi di repositori bersih atau komputer lain.

  • bisa menjadi bug git, karena tidak boleh dibatalkan Z_BUF_ERROR, tetapi untuk memberikan lebih banyak ruang keluaran atau input lebih banyak, lihat: zLib inflate () hang sementara buffer yang tidak dikompresi

    Anda dapat melaporkan laporan bug git ke milis .

  • bisa menjadi masalah gzip mengembang sendiri (mis. Apakah ini bug dalam metode mengembang gzip ini? )

  • bisa jadi bug kernel lama (<= 2.6.32-rc4), jadi tingkatkan kernel Anda

    Lihat: Bug # 547503: git-core: "git clone" gagal pada armel

    Satu-satunya perubahan kernel yang mungkin relevan yang dapat saya temukan adalah commit 5a3a29f(ARM: 5691/1: memperbaiki masalah cache aliasing antara kmap () dan kmap_atomic () dengan highmem , commit 7929eb9upstream) dari 2.6.31.1. Jadi, meskipun saya juga memiliki keraguan, kita bisa beruntung. msg00049


Perintah lain yang berguna untuk dipertimbangkan:


Lihat juga:


Berikut ini gagal kode Git yang relevan ( 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);

dan git_inflate () dari zlib.c

status = inflate(&strm->z,
         (strm->z.avail_in != strm->avail_in)
         ? 0 : flush);

Kernel saya belum setua itu. Saya memiliki 16 GB ram dan menurut gnome-system-monitor saya tidak pergi di atas 1,8 GiB ketika mencoba untuk mendorong. Mendaftarkan kembali objek yang terlalu besar: Saya mengambil perintah dari pertanyaan yang Anda tautkan yang mengaturnya menjadi 50 MB tetapi menambahkan 2 nol. Saya menjalankan perintah yang disebutkan.
UTF-8

Output dari perintah yang Anda tambahkan: pastebin.com/pr3ppsWF
UTF-8

Saya sekarang mencoba git config http.postBuffer 13421772800(menambahkan 2 nol untuk ini) pada sistem sekarang. Tidak bekerja (Kesalahan yang sama.) Program yang terlibat dalam perintah alternatif tampaknya memiliki masalah besar sendiri karena melempar pengecualian. Ini adalah output. Itu juga mengatakan sesuatu tentang file kotor. Apa maksudnya dengan itu?
UTF-8

Aku tidak akrab dengan bfg, tetapi pengecualian mengatakan: No such file or directory. Jika file tersebut ada, mungkin itu adalah bug yang tidak menguraikan spasi putih dengan benar. Atau bug ini terdengar mirip (mungkin folder induk tidak memiliki izin menulis?).
kenorb

2
Saya lupa menerima jawaban yang saya tangkap, sekarang. Itu adalah bug, saya melaporkannya ke milis git, mereka cepat memperbaikinya, perbaikannya digabungkan menjadi hulu, dan bug telah diperbaiki dalam rilis git selama beberapa bulan, sekarang.
UTF-8
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.