Résumé de mon problème: L'un de mes référentiels privés sur Bitbucket a soudainement plus que doublé de taille après avoir poussé l'ajout de quelques centaines d'octets à deux fichiers existants . Le dépôt est désormais supérieur à 2 Go, ce qui a amené Bitbucket à le mettre en mode lecture seule. Parce qu'il est en mode lecture seule, je ne peux pas pousser les modifications qui réduiraient la taille du référentiel. (Capture 22.)
Détails: Mon entreprise a récemment commencé à héberger des dépôts git sur Bitbucket. L'un des référentiels dont je suis responsable avait une taille d'environ 973 Mo, ce qui était inconfortablement proche de la limite logicielle de 1 Go. Pour réduire la taille du référentiel, j'ai suivi les instructions de l'article de la documentation Bitbucket Diviser un référentiel en deux et déplacé environ 450 Mo de documentation et de fichiers d'aide en ligne dans leur propre référentiel privé. J'ai ensuite suivi les instructions dans les articles de documentation de Bitbucket Réduire la taille du référentiel et Maintenir un référentiel git , en particulier:
git count-objects -vH
m'a montré un pack de taille d'environ 973 Mo.
J'ai couru git filter-branch --index-filter 'git rm --cached --ignore-unmatch doc' HEAD
pour supprimer le répertoire doc (qui est le contenu que j'ai déplacé vers le nouveau dépôt).
J'ai exécuté les commandes suivantes pour expirer la référence et la taille:
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --Prune=now
git count-objects -vH
m'a ensuite montré un pack de taille de 881,1 Mio et du -sh .git/objects
a renvoyé 882M. J'ai été déçu que le fait de déplacer plus de 450 Mo réduise la taille du référentiel de moins de 90 Mo, mais j'ai néanmoins poussé les changements vers Bitbucket:
git Push --all --force
git Push --tags --force
La page des paramètres de la copie Bitbucket du dépôt a continué d'afficher une taille de 973 Mo. Je me suis déconnecté, actualisé le navigateur, reconnecté, mais cela n'a pas aidé - la taille du référentiel est restée à 973 Mo.
Ce matin (trois jours après les modifications décrites ci-dessus), j'ai apporté quelques ajouts mineurs à deux fichiers existants qui ont augmenté la taille des fichiers de moins de 1 Ko, les ai ajoutés et validés dans mon référentiel local, puis j'ai poussé la modification vers Bitbucket. Quelques minutes plus tard, j'ai jeté un œil à la page Bitbucket pour le dépôt et j'ai vu une bannière d'avertissement rouge m'informant "Ce dépôt dépasse la limite de 2 Go et est en mode lecture seule." La page des paramètres indique maintenant que le dépôt a une taille de 2,3 Go.
Selon Bitbucket, la poussée de quelques centaines d'octets ajoutée à deux fichiers était certainement la seule activité à se produire sur le référentiel distant au cours des trois derniers jours. Cette poussée n'a peut-être pas été la cause du repo plus que doublé de taille, mais les deux événements étaient étroitement corrélés dans le temps.
git reflog show
ne renvoie rien.
Le clonage d'une nouvelle copie dans un autre répertoire, puis l'exécution de git count-objects me donnent un pack de taille de 881,29 MiB.
Le référentiel local se trouve sur un système CentOS 6.5. la version git est 1.8.5.3.
Questions
Après m'être entretenu avec le support technique de Bitbucket, je peux maintenant répondre à certaines de mes propres questions:
J'ai trouvé que le moyen le plus simple de réduire la taille du dépôt Bitbucket si vous avez dépassé la limite de 2 Go est de
Cela devrait déclencher l'exécution de Bitbucket git gc
sur le repo.
Comme je suis sûr que ceux qui le connaissent le savent déjà, mais git stocke votre historique de version pour les fichiers, donc apporter des modifications et pousser des fichiers ne réduira pas la taille de votre dépôt.
Il existe encore plusieurs façons de réduire les tailles de référentiel sur bitbucket, GitHub, gitlab, etc. La meilleure façon est de supprimer les branches, car cela supprime définitivement tous les fichiers enregistrés par cette branche, tant qu'ils ne sont pas suivis par une autre. Mais vous souhaiterez peut-être les derniers fichiers de cette branche, procédez comme suit:
--cached
pour supprimer la branche distante.Selon l'hôte, vous devrez peut-être exécuter des commandes spéciales, mais cela devrait fonctionner dans la plupart des cas.