webentwicklung-frage-antwort-db.com.de

Repack des Git-Repositorys schlägt fehl

Ich habe ein Git-Repository, das sich auf einem Server mit begrenztem Speicher befindet. Wenn ich versuche, ein vorhandenes Repository vom Server zu klonen, erhalte ich die folgende Fehlermeldung

[email protected]:$ git clone ssh://[email protected]/home/hemi/repos/articles
Initialized empty Git repository in /home/hemi/Skrivebord/articles/.git/
[email protected]'s password: 
remote: Counting objects: 666, done.
remote: warning: suboptimal pack - out of memory
remote: fatal: Out of memory, malloc failed
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed
[email protected]:$ 

Um diesen Fehler zu beheben, habe ich versucht, das ursprüngliche Repository neu zu packen (laut diesem Forenbeitrag ). Anstatt das Repository neu zu packen, wird jedoch beschrieben, wie der Befehl "git pack-objects" verwendet wird.

[email protected]:~/repos/articles$ git repack -a -d --window-memory 10m --max-pack-size 100m
usage: git pack-objects [{ -q | --progress | --all-progress }]
        [--all-progress-implied]
        [--max-pack-size=N] [--local] [--incremental]
        [--window=N] [--window-memory=N] [--depth=N]
        [--no-reuse-delta] [--no-reuse-object] [--delta-base-offset]
        [--threads=N] [--non-empty] [--revs [--unpacked | --all]*]
        [--reflog] [--stdout | base-name] [--include-tag]
        [--keep-unreachable | --unpack-unreachable 
        [<ref-list | <object-list]

Git 1.6.5.7 ist auf dem Server installiert.

55
midtiby

Ihre Lösung verfügt über eine lokale und entfernte Arbeitskopie, die jedoch erneut Probleme verursacht, wenn das entfernte Repository sich erneut neu verpackt. Glücklicherweise können Sie Konfigurationsoptionen festlegen, mit denen der für das Umpacken in beiden Repositorys benötigte Speicherplatz reduziert wird. Diese machen im Wesentlichen die Befehlszeilenparameter, die Sie beim Umpacken zu den Standardoptionen hinzugefügt haben. Sie sollten sich also beim Remote anmelden, in das Repository wechseln und Folgendes tun:

git config pack.windowMemory 10m
git config pack.packSizeLimit 20m

Möglicherweise möchten Sie dasselbe in Ihrem lokalen Repository tun. (Übrigens denke ich, dass entweder Ihr Repository sehr groß ist oder es sich um Computer mit wenig Speicher handelt - diese Werte erscheinen mir sehr niedrig.)

Für das, was sich lohnt, wenn ich malloc Fehler beim Umpacken von sehr großen Repositories in der Vergangenheit erhalten habe, habe ich auch die Werte von core.packedgitwindowsize, core.packedgitlimit, core.deltacachesize, pack.deltacachesize, pack.window und pack.threads geändert, aber es klingt, als ob Sie dies nicht tun würden brauche weitere Optionen :)

100
Mark Longair

Da ich keinen direkten Zugriff auf das Repository hatte und daher kein Repack durchführen konnte, einen flachen Klon durchführte und dann allmählich abholte, während die Tiefe zunahm, half es mir. 

git clone YOUR_REPO --depth=1
git fetch --depth=10
...
git fetch --depth=100
git fetch --unshallow    //Downloads all history allowing to Push from repo

Hoffe es kann noch jemandem helfen.

19
mmm

Ich habe das Problem mit den folgenden Schritten gelöst.

  1. Repository wurde vom Server auf meinem lokalen Rechner ausgecheckt
  2. Repackte das lokale Repository
    git repack -a -d --window-memory 10m --max-pack-size 20m
  3. Erstellt ein leeres Repository auf dem Server
    git init --bare
  4. Das lokale Repository wurde an den Server gesendet
  5. Es wurde geprüft, ob das Server-Repository geklont werden kann 
15
midtiby

Dies beantwortet die Frage nicht, aber jemand könnte darauf stoßen: Das erneute Packen schlägt möglicherweise auf dem Server fehl, wenn pack-objects von einer Art Speicherkiller beendet wird (z. B. von Dreamhost):

$ git clone project-url project-folder
Cloning into project-folder...
remote: Counting objects: 6606, done.
remote: Compressing objects: 100% (2903/2903), done.
error: pack-objects died of signal 9284.51 MiB | 2.15 MiB/s   
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed

Auf Dreamhost scheint dies auf mmap zurückzuführen zu sein. Der Umpackungscode verwendet mmap, um den Inhalt einiger Dateien im Speicher abzubilden. Da der Speicherkiller nicht intelligent genug ist, zählt er die mmapped-Dateien als verwendeten Speicher, wodurch der Git-Prozess beendet wird, wenn er versucht, eine große Datei zu mmap zu machen.

Die Lösung besteht darin, eine benutzerdefinierte Git-Binärdatei mit deaktivierter mmap-Unterstützung (configure NO_MMAP=1) zu kompilieren.

5
zoul

Ich verwende git Version 1.7.0.4 und akzeptiert diesen Befehl. Es ist möglich, dass git Version 1.6 diesen Befehl nicht akzeptiert.

Erstellen Sie ein neues Repository mit einigen zufälligen Commits. Verpacken Sie es dann mit diesem Befehl.

1

Ich hatte das gleiche Problem auf Ubuntu 14.10 mit git 2.1.0 auf einem privaten Repository von github.com. (Entreprise-Router wird vermutet! Funktioniert in anderen WLAN-Netzwerken, außer am Arbeitsplatz)

* GnuTLS recv error (-54): Error in the pull function.
* Closing connection 2jects:  31% (183/589)   
error: RPC failed; result=56, HTTP code = 200
fatal: The remote end hung up unexpectedly
fatal: protocol error: bad pack header

Meine Lösung war, Klon mit ssh zu gitieren (ich habe vorher die ssh-Schlüssel * eingerichtet):

git clone https://github.com/USERNAME/REPOSITORYNAME.git

wird:

git clone [email protected]: USERNAME/REPOSITORYNAME.git

*: (Erzeugen eines SSH-Schlüssels)

ssh-keygen -t rsa -C "[email protected]"

Melden Sie sich dann bei github unter Einstellungen an, importieren Sie ssh-Schlüssel und importieren Sie sie aus ~/.ssh/id_rsa.pub.

0
arcol