J'ai un dépôt GitHub qui avait deux branches - master et release.
La branche de publication contenait des fichiers de distribution binaires qui contribuaient à une très grande taille de dépôt (> 250 Mo), j'ai donc décidé de nettoyer les choses.
J'ai d'abord supprimé la branche de version distante, via git push origin :release
Ensuite, j'ai supprimé la branche de publication locale. J'ai d'abord essayé git branch -d release
, mais git a dit "erreur: La branche 'release' n'est pas un ancêtre de votre HEAD actuel." ce qui est vrai, alors je l'ai fait git branch -D release
pour le forcer à être supprimé.
Mais la taille de mon référentiel, à la fois localement et sur GitHub, était toujours énorme. Alors j'ai parcouru la liste habituelle des commandes git, comme git gc --prune=today --aggressive
, sans chance.
En suivant les instructions de Charles Bailey au SO 1029969, j'ai pu obtenir une liste de SHA1 pour les plus gros blobs. J'ai ensuite utilisé le script de SO 460331 pour trouver les blobs ... et les cinq plus gros n'existent pas, bien que de plus petits blobs soient trouvés, donc je sais que le script fonctionne.
Je pense que ces blogs sont les binaires de la branche release, et ils ont en quelque sorte été abandonnés après la suppression de cette branche. Quelle est la bonne façon de s'en débarrasser?
Réponses:
... et sans plus tarder, puis-je vous présenter cette commande utile, "git-gc-all", garantie de supprimer toutes vos ordures git jusqu'à ce qu'elles puissent apparaître des variables de configuration supplémentaires:
Vous devrez peut-être également exécuter quelque chose comme ça en premier, oh mon Dieu, c'est compliqué !!
Vous devrez peut-être également supprimer certaines balises, merci Zitrax:
J'ai mis tout cela dans un script: git-gc-all-féroce .
la source
objects
. Quels sont ceux-ci et pourquoi sont-ils (apparemment) hors de propos?Comme décrit ici , si vous souhaitez supprimer définitivement tout ce qui est référencé uniquement via reflog , utilisez simplement
git reflog expire --expire-unreachable=now --all
supprime toutes les références de commits inaccessibles dansreflog
.git gc --prune=now
supprime les commits eux-mêmes.Attention : Seule l'utilisation
git gc --prune=now
ne fonctionnera pas car ces commits sont toujours référencés dans le reflog. Par conséquent, la suppression du reflog est obligatoire. Notez également que si vous l'utilisez,rerere
il a des références supplémentaires non effacées par ces commandes. Voirgit help rerere
pour plus de détails. De plus, tous les commits référencés par des branches ou des balises locales ou distantes ne seront pas supprimés car ils sont considérés comme des données précieuses par git.la source
git fetch --prune
réduire davantage la taille en supprimant les objets blob locaux.Comme mentionné dans cette réponse SO ,
git gc
peut en fait augmenter la taille du repo!Voir aussi ce fil
Le même fil mentionne :
Sur le front de la branche filtre, vous pouvez considérer (avec prudence) ce script
la source
filter-branch
utilisation de la commande.git gc --prune=now
, ou niveau basgit prune --expire now
.la source
Chaque fois que votre HEAD bouge, git le suit dans le fichier
reflog
. Si vous avez supprimé des commits, vous avez toujours des "commits en suspens", car ils sont toujours référencés par lereflog
pendant ~ 30 jours. Ceci est le filet de sécurité lorsque vous supprimez des commits par accident.Vous pouvez utiliser la
git reflog
commande remove specific commits, repack, etc., ou simplement la commande de haut niveau:la source
Vous pouvez utiliser
git forget-blob
.L'utilisation est assez simple
git forget-blob file-to-forget
. Vous pouvez obtenir plus d'informations icihttps://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
Il disparaîtra de tous les commits de votre historique, reflog, tags, etc.
Je rencontre le même problème de temps en temps, et chaque fois que je dois revenir sur ce post et sur d'autres, c'est pourquoi j'ai automatisé le processus.
Crédits à des contributeurs tels que Sam Watkins
la source
Essayez d'utiliser git-filter-branch - cela ne supprime pas les gros blobs, mais il peut supprimer les gros fichiers que vous spécifiez de l'ensemble du dépôt. Pour moi, cela réduit la taille du repo de centaines de Mo à 12 Mo.
la source
Parfois, la raison pour laquelle "gc" ne fait pas beaucoup de bien est qu'il y a un rebase ou un stash inachevé basé sur un ancien commit.
la source
Pour ajouter une autre astuce, n'oubliez pas d'utiliser git remote prune pour supprimer les branches obsolètes de vos télécommandes avant d'utiliser git gc
vous pouvez les voir avec git branch -a
C'est souvent utile lorsque vous récupérez à partir de github et de dépôts fourchus ...
la source
Avant de faire
git filter-branch
etgit gc
, vous devez examiner les balises présentes dans votre dépôt. Tout système réel qui a un marquage automatique pour des choses comme l'intégration continue et les déploiements rendra les objets indésirables encore référencés par ces balises, doncgc
ne peut pas les supprimer et vous vous demanderez toujours pourquoi la taille du dépôt est toujours aussi grande.La meilleure façon de se débarrasser de tous les trucs non voulu est de courir
git-filter
etgit gc
puis pousser maître à un nouveau repo nu. Le nouveau repo nu aura l'arbre nettoyé.la source