web-dev-qa-db-fra.com

Comment réduire la taille du dépôt git sur Bitbucket?

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

  1. Pourquoi le déplacement de 450 Mo de fichiers hors du référentiel n'a-t-il réduit la taille de mon référentiel local que de 90 Mo?
  2. Pourquoi même cette modeste réduction n'a-t-elle pas été poussée vers le référentiel distant sur Bitbucket?
  3. Comment diable la taille du référentiel distant est-elle passée de 973 Mo à 2,3 Go?
  4. Comment je le répare? Je ne peux pas pousser vers le référentiel distant même avec le drapeau --force. N'importe quel Push m'obtient le message d'erreur "conq: le référentiel est en mode lecture seule (au-dessus de la limite de taille de 2 Go). Fatal: impossible de lire à partir du référentiel distant."
29
dgvid

Après m'être entretenu avec le support technique de Bitbucket, je peux maintenant répondre à certaines de mes propres questions:

  1. Pourquoi le déplacement de 450 Mo de fichiers hors du référentiel n'a-t-il réduit la taille de mon référentiel local que de 90 Mo? Quelque chose dans l'histoire a été oublié. Je ne sais pas quoi exactement, mais la commande filter-branch a raté quelque chose. J'ai réussi à réduire la taille du référentiel de 450 Mo en exécutant l'utilitaire BFG Repo-Cleaner .
  2. Pourquoi même cette modeste réduction n'a-t-elle pas été poussée vers le référentiel distant sur Bitbucket? C'est le cas, mais le support Bitbucket doit alors exécuter git gc de leur côté. On peut contacter la demande Bitbucket et leur demander d'exécuter git gc sur un dépôt.
  3. Comment diable la taille du référentiel distant est-elle passée de 973 Mo à 2,3 Go? Inconnue. Le support technique de Bitbucket n'avait pas non plus la réponse à celle-ci.
  4. Comment je le répare? Contactez le support Bitbucket. Ils peuvent remettre un référentiel en mode lecture-écriture afin que vous puissiez pousser un référentiel plus petit et qu'ils puissent exécuter git gc de leur côté.
25
dgvid

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

  1. Créer une branche sur Bitbucket
  2. Supprimer cette branche sur Bitbucket

Cela devrait déclencher l'exécution de Bitbucket git gc sur le repo.

30
slimeygecko

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:

  1. Sur la machine locale, créez un dépôt en double. (Sauvegarde, pour ne pas perdre d'informations)
  2. Supprimez une branche que vous souhaitez déplacer ou créez une nouvelle version de. Vous pouvez utiliser --cached pour supprimer la branche distante.
  3. Si vous souhaitez actualiser la branche, vous pouvez copier des fichiers dans une nouvelle branche et pousser.
  4. Si vous souhaitez créer un nouveau référentiel distant, vous pouvez également le faire.

Selon l'hôte, vous devrez peut-être exécuter des commandes spéciales, mais cela devrait fonctionner dans la plupart des cas.

0
gagarwa