Comment puis-je récupérer à partir de “fatal: de mémoire? mmap failed: Ne peut allouer de la mémoire” dans Git?
Permettez-moi de commencer par quelques-contexte:
J'ai eu à passer un crucial Magento boutique en ligne d'une nouvelle version. Pour être sûr que tout le code existant fonctionne encore après la mise à niveau et faire quelques post-mise à niveau des changements, j'ai fait un dépôt Git à partir de l'ensemble de l'installation de Magento (à l'exclusion évidente de contenu comme les 4.5 GO d'images, ./var répertoire etc.), poussé à une origine et cloné sur un serveur de dev. Fait une nouvelle branche, effectué les mises à jour, fait les changements de code, engage tout à la branche dev et repoussé à l'origine.
Le temps est maintenant venu de mettre à niveau la "vraie" boutique, cela signifie que je dois fusionner la branche master sur le serveur de production avec la branche dev. Et puis everyhing va mal:
git fetch
- travaux
git branch
dit: * master
git merge origin/dev
va horriblement mal (sortie seulement après une certaine attente):
fatal: Out of memory? mmap failed: Cannot allocate memory
En va de même pour git checkout dev
, git rebase master origin/dev
etc.
Fait quelques recherches ici sur stackoverflow dans les questions existantes et passé une soirée à essayer des suggestions, y compris (mais non limité à):
git gc
Counting objects: 48154, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (37152/37152), done.
fatal: Out of memory, malloc failed (tried to allocate 527338875 bytes)
error: failed to run repack
et:
git repack -a -d --window-memory 10m --max-pack-size 20m
Counting objects: 48154, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (37152/37152), done.
fatal: Out of memory, malloc failed (tried to allocate 527338875 bytes)
En plus de la précédente commande, j'ai aussi essayé cette (ce qui est assez similaire).
Comme le lien fait mention d'un problème possible avec les systèmes 32 bits, c'est peut-être sage de mentionner les spécifications pour les trois systèmes:
- 'dev' serveur: x86_64 Gentoo 2.6.38-durci-r6 //4 cœurs & 8 go de RAM
- serveur "origine": x86_64 Gentoo 2.6.38-durci-r6 //2 coeurs & 4 go de RAM
- 'live', serveur: Debian x86_64 4.3.2-1.1 2.6.35.5-pv1amd64 //(VPS) 2 carottes & 3 go de RAM
Personne ne sait comment je peux récupérer à partir de cela? Ne remballage sur l'origine? Si oui, comment puis-je convaincre le serveur de production pour extraire une nouvelle copie du référentiel?
Toute aide serait grandement appréciée!
OriginalL'auteur Rem.co | 2011-07-21
Vous devez vous connecter pour publier un commentaire.
L'erreur que vous obtenez provient des fichiers volumineux dans votre référentiel. Git est d'essayer de mettre tout le contenu du fichier dans la mémoire, ce qui le rend croa.
Essayez De Mettre À Niveau Git
Git 1.7.6 est sorti le mois dernier et a cette belle peu dans ses notes de publication:
La mise à niveau à la version 1.7.6 peut vous permettre d'exécuter
git gc
et peut-être mêmegit merge
, mais je ne peux pas vérifier car il est difficile d'obtenir un référentiel dans cet état (les conditions doivent être juste).Essayez de supprimer le contenu des Fichiers
Si la mise à niveau de Git n'aide pas, vous pouvez essayez de supprimer les fichiers de grande taille à partir du référentiel à l'aide de
git filter-branch
. Avant de faire cela, essayez de sauvegarder les fichiers de grande taille à l'aide degit cat-file -p <commit_sha1>:path/to/large/file >/path/to/backup/of/large/file
.Vous aurez envie de faire ces opérations les plus costauds de la machine (beaucoup de mémoire).
Si cela fonctionne, essayez de ré-clonage pour les autres machines (ou simplement rsync l'
.git
répertoire).Il a travaillé à la fin! La mise à niveau de git n'a pas faire le travail, mais
filter-branch
,git gc
, un local reclone et forcer que allégée des pensions de l'origine et vers le bas pour le serveur de production a fait le tour (c'est l'histoire courte, bien sûr ;)). J'ai déjà prévu de travailler, mais a trop peur d'endommager quoi que ce soit.. c'était avant que vous m'quecat-file
truc, qui a fourni une belle sauvegarde avant de nettoyer le tout. merci!Je suis contente que tu ai eu de travail. Trop mauvais, il a pris trop de travail! J'espère que le Git devs permettra de comprendre comment le soutien massif des fichiers tôt, de sorte que les autres n'ont pas le même problème.
OriginalL'auteur Richard Hansen
J'ai vu un peu les rapports de ce qui se passe quand vous faites "git init --bare" dans un répertoire non vide.
Êtes-vous, par hasard, en travaillant avec un "nu"/"serveur" référentiel qui n'est pas vide (ce qui est, a autre chose que la .répertoire git)?
OriginalL'auteur Joost Diepenmaat