2010-06-22 4 views
26

J'héberge un repo git sur un hôte partagé. Mon repo contient forcément deux très gros fichiers, et chaque fois que j'essaie d'exécuter "git gc" sur le repo maintenant, mon processus est tué par le fournisseur d'hébergement partagé pour avoir utilisé trop de mémoire. Existe-t-il un moyen de limiter la quantité de mémoire que git gc peut consommer? Mon espoir serait qu'il puisse échanger l'utilisation de mémoire pour la vitesse et juste prendre un peu plus de temps pour faire son travail.Existe-t-il un moyen de limiter la quantité de mémoire utilisée par "git gc"?

+1

postimum liée: http://stackoverflow.com/a/10293304/274502 – cregox

+0

Oui, eu un problème similaire sur Dreamhost (avec lequel cette question est étiquetée). Pas tellement de cas où 'git' a été tué, mais' darcs' (un autre VCS) est toujours tué, donc il est inutilisable sur http://Dreamhost.com –

Répondre

14

Oui, un coup d'oeil à la page d'aide pour git config et regarder les pack.* d'options, en particulier pack.depth, pack.window, pack.windowMemory et pack.deltaCacheSize. Ce n'est pas une taille totalement exacte car git doit mapper chaque objet en mémoire afin qu'un objet très volumineux puisse causer beaucoup d'utilisation de la mémoire, quels que soient les paramètres de la fenêtre et du cache delta. Vous aurez peut-être plus de chance d'emballer vos fichiers localement et de transférer manuellement les fichiers du pack vers le côté distant, en ajoutant un fichier .keep pour que le git distant n'essaye jamais de tout remballer complètement.

5

Vous pouvez utiliser désactiver l'attribut delta pour désactiver la compression delta uniquement pour les blobs de ces chemins:

En foo/.git/info/attributes (ou foo.git/info/attributes si elle est un dépôt nu) (voir l'entrée delta dans gitattributes et voir gitignore pour la syntaxe du modèle):

/large_file_dir/* -delta 
*.psd -delta 
/data/*.iso -delta 
/some/big/file -delta 
another/file/that/is/large -delta 

Cela n'affectera pas les clones du référentiel. Pour affecter d'autres référentiels (c'est-à-dire des clones), placez les attributs dans un fichier .gitattributes au lieu de (ou en plus du) fichier info/attributes.

+0

C'est de loin la réponse la plus utile pour les gros fichiers. Merci. J'ai un repo de certains PSD, et il prenait des gigaoctets de mémoire pour faire un git gc, maintenant il prend moins de 100 Mo de RAM. Cool. –

30

J'ai utilisé les instructions de ce link. Même idée que Charles Baileys suggéré.

Une copie des commandes est ici:

git config --global pack.windowMemory "100m" 
git config --global pack.packSizeLimit "100m" 
git config --global pack.threads "1" 

Cela a fonctionné pour moi Hostgator avec compte d'hébergement mutualisé.

+2

Merci! Cela fonctionne pour moi, mais je pense qu'il y a une erreur dans la deuxième ligne - il n'y a pas d'option SizeLimit; il devrait lire: git config --global pack.packSizeLimit "100m" – Max

+1

Cela a fonctionné parfaitement. Si cela ne fonctionne pas au début, essayez une limite inférieure sur windowMemory et packSizeLimit. Dans mon cas, 25m était le sweet spot. – jsapara

+0

J'ai changé le nom de l'option. Le lien d'origine est cassé, vous ne savez pas où le pointer. – phunehehe

8

L'utilisation de la mémoire Git Repack est: (pack.deltaCacheSize + pack.windowMemory) × pack.threads. Les valeurs par défaut sont 256 Mo, illimité, nproc. Le cache delta n'est pas utile: la plupart du temps, les deltas informatiques sont dépensés sur une fenêtre glissante, dont la majorité est rejetée; mettre en cache les survivants afin qu'ils puissent être réutilisés une fois (lors de l'écriture) n'améliorera pas le temps d'exécution. Ce cache n'est également pas partagé entre les threads.

Par défaut, la mémoire de la fenêtre est limitée à pack.window (gc.aggressiveWindow). Limiter l'emballage de cette façon est une mauvaise idée, car la taille et l'efficacité de l'ensemble de travail varient considérablement. Il est préférable d'augmenter les deux à des valeurs beaucoup plus élevées et de compter sur pack.windowMemory pour limiter la taille de la fenêtre.

Enfin, le filetage présente l'inconvénient de fendre l'ensemble de travail. Abaisser pack.threads et augmenter pack.windowMemory de sorte que le total reste le même devrait améliorer le temps d'exécution.

Le repack possède d'autres paramètres ajustables (pack.depth, pack.compression, les options bitmap), mais n'affecte pas l'utilisation de la mémoire.

+0

Ne semble pas toute la vérité? Avez-vous une idée: http://stackoverflow.com/questions/42175296/git-gc-uses-a-lot-of-memory-even-i-limited-it – Alex

Questions connexes