Réduire la taille du référentiel git

290

J'ai essayé de chercher un bon tutoriel sur la réduction de la taille du référentiel, mais je n'en ai trouvé aucun. Comment puis-je réduire la taille de mon référentiel ... c'est environ 10 Mo, mais le problème est que Heroku n'autorise que 50 Mo et je suis loin d'avoir fini de développer mon application.

J'ai déjà ajouté les suspects habituels (journal, fournisseur, doc, etc.) à .gitignore. Bien que je n'aie ajouté que .gitignore récemment.

Aucune suggestion?

sent-hil
la source
1
Je viens de le faire et cela l'a ramené à 2,2 Mo ... merci beaucoup! Bien que cela ne semble pas avoir réduit la taille du dépôt sur Heroku..hmm
envoyé le
11
Poussez-le en utilisant --force. Il écrasera le contenu même s'il n'y a pas eu de changement (pas de nouveaux commits, etc.)
Marcin Gil
1
@MarcinGil - Ci-dessous, VonC indique que vous devez avoir accès au serveur pour nettoyer le serveur distant (si je l'analyse correctement).
jww
1
Juste un commentaire pour aider les autres lecteurs s'ils ne savent pas quoi ajouter au .gitignore, il y a un bon service sur gitignore.io qui vous aidera à mettre en place un bon en .gitignorefonction de votre environnement de développement.
Blairg23

Réponses:

351

git gc --aggressiveest une façon de forcer le processus d'élagage (pour être sûr:) git gc --aggressive --prune=now. Vous avez également d' autres commandes pour nettoyer le dépôt. N'oubliez pas, parfois git gcseul peut augmenter la taille du repo !

Il peut également être utilisé après a filter-branch, pour marquer certains répertoires à supprimer de l'historique (avec un gain d'espace supplémentaire); voir ici . Mais cela signifie que personne ne retire de votre repo public. filter-branchpeut conserver les références de sauvegarde.git/refs/original , afin que le répertoire puisse également être nettoyé.

Enfin, comme mentionné dans ce commentaire et cette question ; le nettoyage du reflog peut aider:

git reflog expire --all --expire=now
git gc --prune=now --aggressive

Une solution encore plus complète et peut-être dangereuse consiste à supprimer les objets inutilisés d'un référentiel git

VonC
la source
Dans un autre scénario, voir aussi stackoverflow.com/questions/1029969/…
VonC
1
Note à soi: n'oubliez pas les branches distantes: stackoverflow.com/questions/11255802/…
VonC
1
Note à soi-même: n'oublie pas les balises distantes
saiyancoder
1
En plus des références distantes, le reflog est une autre chose qui peut entraîner la conservation des références que vous essayez de supprimer. stackoverflow.com/q/27489761/1072626
vossad01
1
@jww Je confirme qu'il s'agit d'une opération purement locale. Cela n'a aucune incidence sur la taille du dépôt à distance. Vous auriez besoin d'un accès direct au serveur de ce référentiel distant pour faire de même.
VonC
94

Merci pour vos réponses. Voici ce que j'ai fait:

git gc
git gc --aggressive
git prune

Cela semblait avoir fait l'affaire. J'ai commencé avec environ 10,5 Mo et maintenant c'est un peu plus de 980 Ko.

sent-hil
la source
8
pruneest toujours géré par gc(il y a 2 semaines par défaut).
Cas
117
U peut exécuter les 3 avec prune jusqu'à maintenant en utilisantgit gc --aggressive --prune=now
rahul286
1
Mais, lorsque je supprime le référentiel puis le clone à nouveau, la taille est toujours grande. Comment vas-tu t'occuper de ça?
cwtuan
2

Dans mon cas, j'ai poussé plusieurs gros fichiers (> 100 Mo) puis j'ai procédé à leur suppression. Mais ils étaient encore dans l'histoire de mon repo, j'ai donc dû les supprimer également.

Quelle a été l'astuce:

bfg -b 100M  # To remove all blobs from history, whose size is superior to 100Mb
git reflog expire --expire=now --all
git gc --prune=now --aggressive

Ensuite, vous devez pousser la force sur votre branche:

git push origin <your_branch_name> --force

bfg est un outil qui peut être installé sur Linux et macOS en utilisant brew:

brew install bfg
vinzee
la source