Comment réduire le dossier .git

134

Ma base actuelle a une taille totale d'env. 200MB.

Mais mon dossier .git a une taille incroyable de 5 Go (!). Depuis que je pousse mon travail vers un serveur externe, je n'ai pas besoin d'une grande histoire locale ...

Comment puis-je réduire le dossier .git pour libérer de l'espace sur mon bloc-notes? Puis-je supprimer toutes les modifications datant de plus de 30 jours?

Merci beaucoup pour toute aide :)

JMW
la source
2
Pouvez-vous publier la sortie de git count-objects -v?
CB Bailey
2
Double possible de Réduire la taille du référentiel git
sds

Réponses:

113

vous ne devriez pas supprimer toutes les modifications datant de plus de 30 jours (je pense qu'il est en quelque sorte possible d'exploiter git, mais vraiment déconseillé).

vous pouvez appeler git gc --aggressive --prune, qui effectuera le garbage collection dans votre référentiel et élagera les anciens objets. avez-vous beaucoup de fichiers binaires (archives, images, exécutables) qui changent souvent? ceux-ci mènent généralement à d'énormes dossiers .git (rappelez-vous, git stocke les instantanés pour chaque révision et les fichiers binaires se compressent mal)

tricot
la source
32
En fait, git gc --aggressiveest considérée comme une mauvaise pratique. Il vaut mieux utiliser git repack -a -d --depth=250 --window=250.
Artefact2
18
@knittl: absolument. Voici un message de Linus lui-même: gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefact2
3
@ artefact2: merci pour le lien! Je l'ai lu, et linus fait remarquer que - l'agressif ne réutilisera pas les (bons) deltas - qui ne semblent pas exister dans cette question, parce que le référentiel est énorme. aller dans le sens du remballage prendra en fait beaucoup plus de temps. git gc --aggressiveappelle repack avec une taille de fenêtre de 250 (cf. page de manuel) et une profondeur de 250 (cf. code source). --agressif ajoute en plus le -fcommutateur, pour jeter et refaire toutes les opérations delta précédentes (comme également mentionné dans le lien)
knittl
1
Je viens de vérifier le repo hg.nginx.org/nginx (RELEASE-1.4.0 est une astuce) en utilisant git-remote-hg et cela a donné un dépôt d'environ 100 Mo. L'utilisation a git gc --aggressive --pruneramené ce chiffre à 19 Mo.
Lekensteyn
15
@ Artefact2 Votre déclaration est obsolète : notez l'âge de ce message. En fait, le même jour où elle a été publiée, la discussion sur la liste de diffusion a abouti à ce commit: [..] Donc, les paramètres d'emballage sont les mêmes de nos jours pour les deux méthodes. . --prunen'est pas non plus nécessaire car il est devenu la valeur par défaut depuis v1.5.5-rc0(commit 25ee973 , mars 2008).
Lekensteyn
68

Voici ce que le créateur de git Linus a à dire sur la façon de réduire votre dépôt git:

L'équivalent de "git gc --agressif" - mais fait * correctement * - est de faire (du jour au lendemain) quelque chose comme

   git repack -a -d --depth=250 --window=250

où cette question de profondeur est à peu près la profondeur des chaînes delta (allongez-les pour l'histoire ancienne - cela en vaut la peine), et la fenêtre concerne la taille d'une fenêtre d'objet que nous voulons que chaque candidat delta scanne.

Et ici, vous voudrez peut-être ajouter le drapeau "-f" (qui est le "drop all old deltas", puisque vous essayez maintenant de vous assurer que celui-ci trouve réellement de bons candidats.

source: http://gcc.gnu.org/ml/gcc/2007-12/msg00165.html

Cela supprimera-t-il les données binaires qui sont orphelines dans mon dépôt? "git repack" ne se débarrassera pas des images ou des données binaires que vous avez archivées dans votre référentiel puis supprimées. Pour supprimer définitivement ce type de données de votre repo, vous devez réécrire votre historique. Un exemple courant de cela est lorsque vous archivez accidentellement vos mots de passe dans git. Vous pouvez revenir en arrière et supprimer certains fichiers, mais vous devez ensuite réécrire votre historique à partir de là, puis forcer le transfert du nouveau dépôt à votre origine.

David Dehghan
la source
Pour moi, le dossier .git est d'environ 1,5G. J'ai essayé ceci, mais j'ai eu une erreur de suivi. fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
Miron
2
Après une exécution repacklocale, un commit et un push, le rétrécissement sera-t-il également rendu distant?
Timo
@David Dehghan: Hé, j'ai essayé cela depuis le répertoire du projet mais la taille du dossier .git n'a pas changé. Est-ce que c'est prévu ou dois-je pousser pour voir les changements? (désolé pas très expérimenté avec git.) J'ai une image / gif dans le repo et j'ai commis plusieurs fois différentes versions de cette image et je suppose que la taille du .git a augmenté.
giorgim
Salut, malheureusement, c'est maintenant ainsi que vous nettoyez l'ancienne version binaire. Pour ce faire, vous devez réécrire votre histoire, ce qui est en fait compliqué. Voici quelques pistes
David Dehghan
22

J'ai essayé ces derniers mais mon référentiel était encore très volumineux. Le problème était que j'avais accidentellement enregistré certains gros fichiers générés. Après quelques recherches, j'ai trouvé un excellent tutoriel qui facilite la suppression des gros fichiers générés. Ce tutoriel m'a permis de réduire mon référentiel de 60 Mo à <1 Mo.

Steve Lorek, Comment réduire un référentiel Git

Chris Hinshaw
la source
4
Voici une version archivée en cas de pourriture du lien. Cette réponse est / a été utile pour un dépôt que je suis tombé sur où des fichiers .exe et .zip ont été commis, ce qui a gonflé la taille du dossier
.git
9

5 Go contre 200 Mo est un peu bizarre. Essayez de courirgit gc .

Mais non, à moins que vous ne divisiez votre référentiel en modules, vous ne pouvez pas réduire la taille du .git répertoire.

Chaque clone d'un référentiel git est un référentiel à part entière qui peut agir comme un serveur. C'est le principe de base du contrôle de version distribué.

Šimon Tóth
la source
3

J'utilise git plus comme mécanisme de synchronisation que pour l'historique des versions. Ma solution à ce problème a donc été de m'assurer que toutes mes sources actuelles étaient dans un état satisfaisant, puis de supprimer simplement .git et de réinitialiser les dépôts. Problème d'espace disque résolu. :-) L'histoire a disparu :-( Je fais ça parce que mon dépôt est sur une petite clé USB. Je ne veux pas ou n'ai pas besoin de tout mon historique. Si j'avais une méthode pour simplement tronquer l'historique, j'utiliserais ça.

Si je voulais garder mon historique, j'archiverais le référentiel actuel. À un moment donné plus tard, je pourrais cloner le référentiel d'origine, copier toutes les modifications du nouveau référentiel (supposons que je n'ai pas fait beaucoup (aucun) changement de nom ou suppression). Et puis faites un gros commit qui représenterait toutes les modifications apportées dans le nouveau repo comme un seul commit dans l'ancien repo. Est-il possible de fusionner les histoires? Peut-être que si j'utilisais une branche puis supprimais les objets dont je n'avais pas besoin. (Je n'en sais pas assez sur les composants internes de git pour commencer à jouer comme ça).

Darrel Lee
la source
1
Vous pouvez simplement utiliser Dropbox pour ce cas d'utilisation à la place. Je l'ai fait pendant de nombreuses années.
Jonny
0

J'ai essayé les méthodes ci-dessus, rien n'a fonctionné dans mon cas (où j'ai accidentellement tué le processus git pendant git push), donc j'ai finalement dû supprimer le dépôt et le cloner à nouveau et maintenant le dossier .git est de taille normale.

JerryGoyal
la source
J'ai dû utiliser la même solution car mon disque était plein (le dossier .git étant> 90 Go), donc je ne pouvais même pas exécuter un repack ou git gc!
Fl4v