165 votes

Pourquoi est mon dépôt git si grand ?

145 M = .git/objects/pack/

J'ai écrit un script pour ajouter des tailles des différences de chaque validation et la validation avant d'aller vers l'arrière à partir de l'extrémité de chaque branche. Je reçois 129MB, qui est sans compression et sans comptabilité pour les mêmes fichiers à l'échelle des directions générales et de l'histoire commune entre les branches.

Git prend toutes ces choses en compte, donc je m'attends à beaucoup plus petite référentiel. Alors, pourquoi est .git si grand?

J'ai fait:

git fsck --full
git gc --prune=today --aggressive
git repack

Pour répondre au sujet de la façon dont beaucoup de fichiers/commits, j'ai 19 succursales environ 40 fichiers dans chaque. 287 s'engage, trouvé à l'aide de:

git log --oneline --all|wc -l

Il ne doit pas être prise à 10 méga-octets pour stocker des informations à ce sujet.

195voto

Vi. Points 5841

Quelques scripts que j’utilise :

git-fatfiles :

git-éradiquer (pour `` ) :

Remarque : le second script est conçu pour supprimer les infos de Git complètement (y compris toutes les infos de reflogs). Utiliser avec précaution.

72voto

pgs Points 3453

Récemment, j'ai tiré le mauvais référentiel distant dans le local (git remote add ... et git remote update). Après la suppression de l'indésirables à distance ref, des branches et des tags, j'ai encore eu 1.4 GO (!) de l'espace perdu dans mon référentiel. Je n'ai pu me débarrasser de ce par clonage avec git clone file:///path/to/repository. Notez que l' file:// fait un monde de différence lors du clonage d'un référentiel local uniquement les objets référencés sont copiés, pas l'ensemble de la structure de répertoire.

Edit: Voici Ian est un liner:

d1=#original repo
d2=#new repo
cd $d1
for b in $(git branch | cut -c 3-)
do
    git checkout $b
    x=$(git rev-parse HEAD)
    cd $d2
    git checkout -b $b $x
    cd $d1
done

70voto

Charles Bailey Points 244082

git gc d'une git repack donc il n'y a pas de sens dans l'manuellement reconditionnement à moins que vous allez passer certaines options spéciales.

La première étape est de voir si la majorité de l'espace est (comme ce serait normalement le cas) de votre base de données objet.

git count-objects -v

Cela devrait donner un rapport de combien déballé objets, il y a dans votre référentiel, de combien d'espace ils prennent place, combien de fichiers du pack que vous avez et combien d'espace qu'ils occupent.

Idéalement, après un repack, vous n'avez pas déballé objets et un fichier de pack mais il est parfaitement normal d'avoir quelques objets qui ne sont pas directement référence actuelle des branches toujours présent et décompressé.

Si vous avez un gros pack et que vous voulez savoir qu'est-ce que la prise de l'espace, alors vous pouvez lister les objets qui composent le pack avec la façon dont ils sont stockés.

git verify-pack -v .git/objects/pack/pack-*.idx

Notez que verify-pack prend un fichier d'index et de ne pas le pack de fichier lui-même. Ce qui donne un rapport de chaque objet dans le pack, sa vraie taille et sa taille ainsi que des informations quant à savoir si elle a été 'deltified" et si donc l'origine de la chaîne delta.

Pour voir si il y a quelque exceptionnellement gros objets dans le référentiel, vous pouvez trier la sortie numérique sur le troisième de la quatrième colonnes (par exemple, | sort -k3n).

À partir de cette sortie, vous serez en mesure de voir le contenu de n'importe quel objet à l'aide de l' git show de commande, même s'il n'est pas possible de voir exactement où dans le commit l'histoire du référentiel de l'objet référencé. Si vous avez besoin pour ce faire, essayez quelque chose de cette question.

43voto

John Gietzen Points 23645

Juste pour info, la principale raison pour laquelle vous pouvez vous retrouver avec des objets indésirables d'être maintenu autour de est que git gère une reflog.

Le reflog est là pour sauver vos fesses lorsque vous supprimez accidentellement votre branche master ou en quelque sorte le contraire de la situation catastrophique des dommages à votre référentiel.

La façon la plus simple de résoudre ce problème est de tronquer votre reflogs avant de le compresser (assurez-vous juste que vous ne voulez jamais à revenir à n'importe quel de les commits dans le reflog).

git gc --prune=now --aggressive
git repack

Cela est différent de l' git gc --prune=today en ce qu'il expire l'ensemble de la reflog immédiatement.

4voto

CesarB Points 18048

Êtes-vous sûr d'en comptant seulement les .pack de fichiers et pas les .les fichiers idx? Ils sont dans le même répertoire que le .pack de fichiers, mais ne les ont pas toutes les données du référentiel (comme l'extension l'indique, ils ne sont rien de plus que les indices correspondant au pack — en fait, si vous connaissez le bon de commande, vous pouvez facilement recréer à partir du fichier de pack, et git lui-même est-il lorsque le clonage, comme seul un pack de fichier est transféré à l'aide de la maternelle protocole git).

Comme un échantillon représentatif, j'ai pris un coup d'oeil à mon clone local de linux-2.6 référentiel:

$ du -c *.pack
505888  total

$ du -c *.idx
34300   total

Ce qui indique une expansion de l'ordre de 7% doit être commune.

Il y a aussi les fichiers en dehors de objects/; dans mon expérience personnelle, de leur index et gitk.cache ont tendance à être les plus grands (total de 11 m dans mon clone de linux-2.6 référentiel).

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