Existe-t-il un moyen de réduire la taille du dossier git?

156

On dirait que mon projet devient de plus en plus gros avec chaque git commit/push. Existe-t-il un moyen de nettoyer mon dossier git?

Sheehan Alam
la source

Réponses:

214

Je ne sais pas ce que tu veux. Tout d'abord, bien sûr, chaque fois que vous validez / poussez le répertoire va devenir un peu plus gros, car il doit stocker chacun de ces commits supplémentaires.

Cependant, vous souhaitez probablement git gc"nettoyer les fichiers inutiles et optimiser le référentiel local" ( page de manuel ).

Une autre commande éventuellement pertinente est celle git cleanqui supprimera les fichiers non suivis de votre arborescence ( page de manuel ).

houbysoft
la source
30
git clean -d -f -x supprime les fichiers répertoriés dans .gitignore et autres. Par exemple, les espaces de travail qui n'appartiennent pas à git, le dossier Pods, etc.
Kalle
102
WARNINGLa commande comme écrite ci-dessus par @Kalle supprimera TOUS LES FICHIERS ET RÉPERTOIRES> NON SUIVIS < DANS VOTRE GIT ROOT , pas seulement "les fichiers répertoriés dans .gitignore". Tout ce qui n'est pas suivi par Git, qu'il soit répertorié ou non, .gitignoresera effacé. git clean -dfX(notez le cas sur le X) supprimera uniquement les éléments qui ont une règle applicable dans .gitignore. Veuillez tenir compte de cet avertissement: ne jamais exécuter git cleansans l'exécuter en mode interactif, avec -iau lieu de -f, ou au moins faire un essai à sec d'abord - -npuis à nouveau avec -f.
Adrian Günter
5
Ou faire une sauvegarde :-)
Mateen Ulhaq
61

Courir:

git remote prune origin

Supprime toutes les branches de suivi obsolètes qui ont déjà été supprimées originmais qui sont toujours disponibles localement dans remotes/origin.

git gc --auto

' G arbage C ollection ' - exécute les tâches de maintenance (compresse les révisions, supprime les objets lâches / inaccessibles). L' --autoindicateur détermine d'abord si un travail est nécessaire et se termine sans rien faire sinon.

phamductri
la source
4
Une explication de ce qu'ils font? Je sais que nous pouvons les rechercher sur Google et rechercher leur documentation, mais il est courant de fournir une brève description de votre réponse lorsqu'elle ne concerne que du code ou des commandes.
Dzhuneyt
28

Un scénario dans lequel votre dépôt git s'agrandira sérieusement avec chaque commit est celui où vous commettez des fichiers binaires que vous générez régulièrement. Leur stockage ne sera pas aussi efficace qu'un fichier texte .

Un autre est celui où vous avez un grand nombre de fichiers dans un dépôt (qui est une limite de git ) au lieu de plusieurs sous-dépôts ( gérés comme des sous-modules ).

Dans cet article sur git space , AlBlue mentionne:

Notez que Git (et Hg, et d'autres DVCS) souffrent d'un problème où les (gros) binaires sont archivés, puis supprimés, car ils apparaîtront toujours dans le référentiel et prendront de l'espace, même s'ils ne sont pas à jour .

Si vous avez de gros binaires stockés dans votre référentiel git, vous pouvez envisager:

Comme je l'ai mentionné dans " Quelles sont les limites de fichiers dans Git (nombre et taille)? ", Le plus récent (2015, 5 ans après cette réponse) Git LFS de GitHub est un moyen de gérer ces gros fichiers (en les stockant en dehors du Dépôt Git).

VonC
la source
1
La prise en charge des gros fichiers git est utile si vous avez régulièrement des fichiers binaires volumineux (comme des images) ajoutés / mis à jour. Voir git-lfs.github.com . Super facile à implémenter, pris en charge par github. Tous les membres de l'équipe doivent l'installer pour l'utiliser de manière collaborative.
Eric Woods
@EricWoods True. J'ai déjà mentionné Git-LFS (64 fois: stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ). J'ai modifié cette ancienne réponse en conséquence.
VonC
Ha, en effet! C'est drôle comme une réponse de 9 ans et plus est toujours pertinente (et maintenant encore plus avec les infos LFS).
Eric Woods
22

oui oui, git gcest la solution, naturellement,

et localement - vous pouvez simplement supprimer le référentiel local et le cloner à nouveau,

mais il y a quelque chose de plus important ici ...

les secondes que vous attendez pour que cet énorme git & externals traite soient collectées à de longues minutes dans lesquelles sont collectées à des heures de temps inefficace passé,

Créez un nouveau référentiel (entièrement, pas seulement une branche) à partir de zéro , y compris la seule version récente des fichiers, naturellement vous perdrez toute l'histoire,

mais quand dans le monde du code, il n'est pas temps de devenir sentimental, il ne sert à rien de faire glisser les 5 années entières de code à chaque commit ou diff, vous pouvez toujours stocker les anciens git & externals quelque part, si vous êtes nostalgique:]

mais, à un moment donné, vous devez vraiment avancer:]

votre équipe vous remerciera!

Communauté
la source
12
Tout à fait d'accord, nous avons récemment adopté cette approche avec un ancien référentiel et n'avons pas regardé en arrière; eh bien, principalement parce que nous ne pouvons pas, mais vous savez ce que je veux dire :)
WhatIsHeDoing
13

Exécuter cette commande est extrêmement dangereux, mais réduira votre référentiel en effaçant tous vos fichiers de récupération / sauvegarde git:

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

Cela effacera tous les fichiers que git utilise pour récupérer votre référentiel à partir d'une mauvaise commande, par exemple, si vous l'avez fait git reset --hard, vous pouvez généralement récupérer les fichiers perdus. Mais si vous le faites git reset --hardavant la git reflog expire...commande, vous avez tout perdu. Maintenant, votre seul espoir est d'utiliser un outil qui analyse votre système de fichiers et d'essayer de récupérer les fichiers effacés, s'ils n'ont pas été remplacés.

utilisateur
la source
3
Je n'appellerais vraiment pas cela extrêmement dangereux . Je dirais simplement que vous devez faire attention . D'après mon expérience, très peu d'entre eux touchent le reflog ou les objets inaccessibles - la plupart ne savent même pas qu'ils sont là ou comment interagir avec eux, et restent donc coincés dans des situations où ils seraient utiles ou feraient des choses terriblement manière inefficace. J'irais jusqu'à dire que si vous ne savez pas et ne pouvez pas comprendre ce que ces commandes vont faire, vous pouvez les exécuter en toute sécurité!
Chris Morgan
10

git clean -d -f -i est la meilleure façon de le faire.

Cela aidera à nettoyer de manière plus contrôlée.

-i signifie interactif.

anandharshan
la source
3
Bien que la question du PO soit vague, et que ce soit une bonne réponse à cet égard, je tiens à souligner que ce git cleann'est pas tant pour nettoyer le repo que pour nettoyer le répertoire. Pour les utilisateurs qui copient / collent aveuglément, méfiez-vous; cela supprime les fichiers / répertoires non suivis que vous pourriez souhaiter localement.
sraboy
git clean -d -x -f fonctionne bien si vous voulez nettoyer en profondeur
Rishabh Jain
2

Je ne sais pas si cela le réduira, mais après avoir couru git clean, je le fais souvent git repack -adaussi, ce qui réduit le nombre de fichiers du pack.

Damien Sawyer
la source
5
repack fait partie du git gcprocessus, donc pas besoin de l'exécuter séparément
artkoshelev