git: "pack has bad object" beim Drücken auf Remote

3599
UTF-8

Ich habe ein reines Git-Repository auf meinem Raspberry Pi, das nur ich verwende. Beim heutigen Anstoß habe ich folgende Fehlermeldung erhalten:

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' 

Wie Sie sehen, wird auf das Repository über ssh zugegriffen. (Ich habe die IP-Adresse geändert.)

Ich habe mehrmals versucht, bekam aber den gleichen Fehler (auch bei den gleichen Nummern). Dann entschied ich mich, ein neues Repository zu erstellen, indem ich den Ordner des alten löschte, einen Ordner mit demselben Namen erstellt und darin ausführte git init --bare.

Jetzt bekomme ich diese Fehlermeldung, wenn ich dazu drücke:

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' 

Was ist das Problem und wie bringe ich es wieder zum Laufen?

Ich führe git Version 1.9.1 auf einem 64-Bit-Linux-Kernel 3.19 aus.


Aktualisierung mit zusätzlicher Ausgabe:

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' 

Ich habe jetzt ein neues Betriebssystem installiert (Ubuntu 16.04 64 Bit mit dem allgemeinen 4.4.0-21-Kernel) und git ist jetzt Version 2.7.4. Ich habe das alte Repo nicht in das neue System kopiert, sondern nur den Inhalt davon kopiert und ein neues Repo erstellt. Außerdem habe ich das Repo auf meinem Raspberry Pi gelöscht und ein neues Bare-Repo darauf erstellt. Ich habe jetzt SmartGit verwendet, um die Dateien zum Repo hinzuzufügen und zu versuchen, es zu pushen. Das Problem besteht jedoch weiterhin:

Screenshot des SmartGit-Fehlerdialogs.


Es funktioniert, wenn ich ein Bare-Repository lokal erstelle, es als Remote-Gerät hinzufüge und dann zu ihm drücke. Dann kann ich das Repository-Verzeichnis auf das Raspberry Pi übertragen und es als Remote über ssh verwenden. Es scheint also, dass das Problem nur auftritt, wenn viele Daten (oder möglicherweise große Commits) über ein Netzwerk übertragen werden.

3
es sieht aus wie dein lokales Repository ist kaputt ... Jakuje vor 8 Jahren 0
Können Sie "git fsck --full" und "git gc" ausführen? Hilft es? Machen Sie auch 'fsck' auf Ihrem Himbeer-Speichergerät und führen Sie einige Speichertests durch. Versuchen Sie, den Befehl mit folgendem Befehl auszuführen: GIT_TRACE = 1`. kenorb vor 8 Jahren 0
Was ist deine Git-Version? Wie groß sind Ihre Packdateien ("du -hs .git / objects / pack")? Verwenden Sie eine Art VPN oder Proxy? kenorb vor 8 Jahren 1
[Ich habe die Befehle ausgeführt] (http://pastebin.com/U1fbCDJK), konnte jedoch nicht herausfinden, wo "GIT_TRACE = 1" platziert werden sollte. UTF-8 vor 8 Jahren 0

1 Antwort auf die Frage

2
kenorb

Der pack-objects(Mann git-pack-objects) starb an Signal 13 ( gebrochene Pipe ), weil gitdas Objekt nicht aufgeblasen (dekomprimieren) konnte und es mit einem Fehler fehlgeschlagen ist (Fehlercode -5 könnte einen Out-of-Mem- oder Überschreib- / Überlappungsfehler bedeuten ).

Erläuterung

Gemäß dem zlib-Handbuch werden die Fehler wie folgt definiert:

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

wo -5bedeutet, dass kein Fortschritt möglich ist oder wenn nicht genügend Platz im Ausgabepuffer vorhanden ist.

Z_BUF_ERRORwenn kein Fortschritt möglich ist oder wenn zu wenig Speicherplatz im Ausgabepuffer vorhanden Z_FINISHist. Beachten Sie, dass dies Z_BUF_ERRORnicht fatal ist und inflate()erneut mit mehr Eingabe und mehr Ausgabefläche aufgerufen werden kann, um das Dekomprimieren fortzusetzen.

Was wir in der zlib-FAQ lesen können :

Stellen Sie vor dem Telefonieren sicher, dass avail_inund avail_outnicht Null sind. Wenn Sie den Parameter Flush auf gleich setzen Z_FINISH, stellen Sie außerdem sicher, dass avail_out groß genug ist, um die Verarbeitung aller anstehenden Eingaben zu ermöglichen. Beachten Sie, dass a Z_BUF_ERRORnicht fatal ist - ein weiterer Aufruf von deflate () oder inflate () kann mit mehr Eingabe- oder Ausgabeflächen erfolgen. A Z_BUF_ERRORkann in der Tat unvermeidlich sein, je nachdem, wie die Funktionen verwendet werden, da nicht erkennbar ist, ob bei strm.avail_outRückgaben mit Null mehr Ausgabe ansteht oder nicht . Ein ausführlich kommentiertes Beispiel finden Sie in zlib Usage Example .


Lösung

Dies kann mit wenigen Dingen zusammenhängen:

  • das Objekt, das gedrückt wird, ist zu groß, so dass für zlib Speicherplatz erforderlich ist, sodass Sie mehr Platz im Ausgabe-Zlib-Puffer benötigen.

    Versuchen Sie in diesem Fall zu erhöhen http.postBuffer, z

    git config http.postBuffer 134217728 # =~ 128MB 

    Alternativ können Sie auch bfggrößere Blobs entfernen, z

    java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git 
  • Ihr Objekt ist beschädigt, also führen Sie git fsck --fullundgit gc

    Möglicherweise wurde der Speicher oder das Speichergerät beschädigt. Versuchen Sie es daher auf einem sauberen Repository oder einem anderen Computer.

  • Es könnte sich um einen Git-Fehler handeln, da er nicht weiter abgebrochen werden sollte Z_BUF_ERROR, aber um mehr Ausgabebereich oder mehr Eingabe bereitzustellen, siehe: zLib inflate () hängt während der Dekomprimierung des Puffers

    Sie können einen Fehlerbericht an die Mailingliste melden .

  • könnte ein gzip inflate Problem sein (zB Ist dies ein Fehler in dieser gzip inflate-Methode? )

  • Es könnte sich um einen alten Kernel-Fehler handeln (<= 2.6.32-rc4). Aktualisieren Sie also Ihren Kernel

    Siehe: Fehler # 547503: git-core: "git clone" schlägt am Armel fehl

    Die einzig relevante Kernel-Änderung, die ich finden konnte, war commit 5a3a29f(ARM: 5691/1: Cache-Aliasing-Probleme zwischen kmap () und kmap_atomic () mit highmem, commit 7929eb9upstream) von 2.6.31.1. Obwohl ich auch meine Zweifel habe, könnten wir Glück haben. msg00049


Andere nützliche Befehle, die Sie berücksichtigen sollten:


Siehe auch:


Hier versagt der relevante Git-Code ( 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); 

und git_inflate () von zlib.c

status = inflate(&strm->z, (strm->z.avail_in != strm->avail_in) ? 0 : flush); 
Mein Kernel ist nicht so alt. Ich habe 16 GB RAM, und laut gnome-system-monitor gehe ich beim Push-Versuch nicht über 1,8 GiB. Umbau des zu großen Objekts: Ich habe den Befehl aus der Frage, die Sie verlinkt haben, auf 50 MB gesetzt, aber 2 Nullen hinzugefügt. [Ich habe die erwähnten Befehle ausgeführt.] (Http://pastebin.com/U1fbCDJK) UTF-8 vor 8 Jahren 0
Die Ausgabe der Befehle, die Sie hinzugefügt haben: http://pastebin.com/pr3ppsWF UTF-8 vor 8 Jahren 0
Ich habe jetzt `git config http.postBuffer 13421772800` (fügte 2 Nullen hinzu) auf dem Now-System versucht. Funktionierte nicht (Gleicher Fehler.) Das Programm, das an dem alternativen Befehl beteiligt ist, scheint selbst große Probleme zu haben, da es Ausnahmen auslöst. [Dies ist die Ausgabe.] (Http://pastebin.com/3LkE4Q16) Sie sagt auch etwas über eine schmutzige Datei aus. Was bedeutet das? UTF-8 vor 8 Jahren 0
Ich bin nicht mit `bfg` vertraut, aber die Ausnahme sagt:` Keine solche Datei oder Verzeichnis '. Wenn die Datei existiert, ist es vielleicht ein Fehler, der Leerzeichen nicht richtig analysiert. Oder dieser [Fehler] (https://github.com/rtyley/bfg-repo-cleaner/issues/39) hört sich ähnlich an (wahrscheinlich haben der übergeordnete Ordner keine Schreibberechtigungen?). kenorb vor 8 Jahren 0
Ein Whitespace-Parsing-Fehler wäre schlecht, da dieses Repository Tausende von Dateien enthält, von denen die meisten Whitespaces im Namen enthalten. Der Ordner und alle Unterordner haben definitiv Schreibrechte (ich verwende sie jeden Tag; die haben `drwxr-xr-x`). UTF-8 vor 8 Jahren 0
Ich bin mir nicht sicher, stellen Sie bitte eine separate Frage zum Thema "bfg". Vielleicht könnte jemand helfen. kenorb vor 8 Jahren 0
Ich habe vergessen, diese Antwort zu akzeptieren, die ich jetzt eingeholt habe. Es war ein Fehler, ich habe ihn an die git-Mailingliste gemeldet, sie haben das Problem schnell behoben, der Fix wurde in den Upstream eingebunden, und der Fehler wurde in den Releases von git nun seit einigen Monaten behoben. UTF-8 vor 7 Jahren 2