229 votes

Comment réduire le dossier .git

Ma base actuelle a une taille totale d'environ 200 Mo.

Mais mon dossier .git a une taille incroyable de 5 Go ( !). Comme je pousse mon travail vers un serveur externe, je n'ai pas besoin d'un gros historique local...

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

Merci beaucoup pour toute aide :)

2 votes

Pouvez-vous afficher la sortie de git count-objects -v ?

4 votes

Duplicata possible de Réduire la taille du dépôt git

0 votes

Mon problème était git lfs prenait des tonnes d'espace dans le .git/lfs dir. En exécutant git lfs prune J'ai réduit mon .git taille du dossier par >60 GO ! J'ai ajouté ces informations et d'autres encore dans ma réponse ici .

7voto

Yash Points 4565

Réduire un dépôt Git en supprimant certains fichiers de l'historique du journal du dépôt Git. .git Dossier basé sur leur dernière heure de mise à jour.

J'ai rencontré le même problème sur ma machine locale. La raison en est que j'ai supprimé quelques fichiers massifs de ma machine locale et les ai transférés dans le référentiel central. Mais après git status , git fetch y git pull . Mon .git La taille du dossier est d'environ 3 Go. J'ai ensuite exécuté la commande suivante pour réduire la taille du dossier .git en considérant les fichiers qui ont été modifiés/expirés il y a un mois.

Commande

$ git remote prune origin && git repack && git prune-packed && git reflog expire --expire=1.month.ago && git gc --aggressive

Git Commandes et leur brève description :

  • git-prune - Supprimer tous les objets inaccessibles de la base de données d'objets.
  • git-repack - Emballer les objets déballés dans un référentiel
  • git-prune-packed - Supprimez les objets supplémentaires qui se trouvent déjà dans les fichiers du pack.
  • git reflog : Git garde la trace des mises à jour de l'extrémité des branches en utilisant un mécanisme appelé journaux de référence, ou "reflogs". Les reflogs permettent de savoir quand les refs Git ont été mises à jour dans le dépôt local. En plus des reflogs des extrémités des branches, un reflog spécial est maintenu pour la cachette Git. Les reflogs sont stockés dans des répertoires sous le répertoire .git Les répertoires git reflog se trouvent à l'adresse suivante .git/logs/refs/heads/. , .git/logs/HEAD et aussi .git/logs/refs/stash si la cachette git a été utilisée sur le repo. git reflog à un niveau élevé sur le repo Rewriting History Page.
    git reflog expire --expire=now --expire-unreachable=now --all
    En plus de préserver l'historique dans le reflog, Git a des dates d'expiration internes sur le moment où il élague les commits détachés. Encore une fois, il s'agit de détails d'implémentation que git gc les poignées et git prune ne doit pas être utilisé de manière autonome.
  • git gc --aggressive : git-gc - Nettoyer les fichiers inutiles et optimiser le référentiel local.
    Dans les coulisses, git gc exécute en fait un paquet d'autres sous-commandes internes comme git prune, git repack, git pack and git rerere . La responsabilité de haut niveau de ces commandes est d'identifier tous les objets Git qui sont en dehors des niveaux de seuil définis à partir de la base de données de l'entreprise. git gc configuration. Une fois identifiés, ces objets sont ensuite compressés ou élagués en conséquence.

Commonad avec le résultat :

$ git remote prune origin && git repack && git prune-packed && git reflog expire --expire=1.month.ago && git gc --aggressive
Enumerating objects: 535, done.
Counting objects: 100% (340/340), done.
Delta compression using up to 2 threads
Compressing objects: 100% (263/263), done.
Writing objects: 100% (340/340), done.
Total 340 (delta 104), reused 0 (delta 0)
Enumerating objects: 904, done.
Counting objects: 100% (904/904), done.
Delta compression using up to 2 threads
Compressing objects: 100% (771/771), done.
Writing objects: 100% (904/904), done.
Total 904 (delta 343), reused 561 (delta 0)

3voto

Darrel Lee Points 226

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 sont dans un état satisfaisant, puis de supprimer .git et de réinitialiser les dépôts. Problème d'espace disque résolu :-) L'histoire a disparu :-( Je fais cela parce que mon dépôt est sur une petite clé USB. Je ne veux pas ou n'ai pas besoin de l'ensemble de mon historique. Si j'avais une méthode pour simplement tronquer l'historique, je l'utiliserais.

Si je voulais conserver mon historique, j'archiverais le dépôt actuel. A un moment donné, plus tard, je pourrais cloner le dépôt original, copier toutes les modifications du nouveau dépôt. le nouveau dépôt (supposons que je n'ai pas fait beaucoup (aucun) renommage ou suppression). Et ensuite faire un gros commit qui représenterait toutes les modifications faites dans le nouveau repo comme un seul commit dans le ancien repo. Est-il possible de fusionner les historiques ? Peut-être que si j'utilisais une branche et qu'ensuite supprimer les objets dont je n'ai pas besoin. (Je ne connais pas assez les mécanismes internes de Git pour commencer à m'amuser comme ça).

1 votes

Vous pourriez simplement utiliser Dropbox pour ce cas d'utilisation. Je l'ai fait pendant de nombreuses années.

0 votes

Pour une synchronisation pure, essayez FreeFileSync ou rsync , comme je l'explique dans ma réponse ici . Ceci étant dit, j'utilise occasionnellement git pour la synchronisation aussi, comme je l'explique pour mon sync_git_repo_from_pc1_to_pc2.sh outil ici et dans mon autre réponse ici : Travailler sur un projet distant avec Eclipse via SSH .

1voto

JerryGoyal Points 9110

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

0 votes

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

0 votes

Essayez la commande pour supprimer rm -rf .git/objects/pack/pack-*

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X