19 votes

Pourquoi les gros fichiers existent-ils toujours dans mon fichier packfile, après les avoir nettoyés avec filter-branch ?

J'ai réécrit l'historique de mon référentiel pour supprimer certains gros fichiers FLV en utilisant git filter-branch . J'ai principalement suivi l'article de Github sur les suppression des données sensibles et des instructions similaires trouvées ailleurs sur Internet :

Suppression des gros FLV :

git filter-branch --index-filter 'git rm --cached --ignore-unmatch public/video/*.flv' --prune-empty -- --all

Suppression des références originales :

rm -rf .git/refs/original/

Nettoyer le reflog :

git reflog expire --expire=now --all

Élagage des objets inaccessibles :

git gc --prune=now

Agressivement l'élagage des objets inaccessibles :

git gc --aggressive --prune=now

Je remballe des choses :

git repack -A -d

Et mon gitdir est toujours de 205 Mo, contenu presque entièrement dans un seul packfile :

$ du -h .git/objects/pack/*
284K    .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.idx
204M    .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.pack

Utilisation de ce script Je peux voir que les FLVs que j'ai supprimés sont toujours contenus dans le pack :

All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file.
size   pack   SHA                                       location
17503  17416  1be4132fa8d91e6ce5c45caaa2757b7ea87d87b0  public/video/XXX_FINAL.flv
17348  17261  b7aa83e187112a9cfaccae9206fc356798213c06  public/video/YYY_FINAL.flv
....

Cloner le référentiel via git clone --bare my-repo donne my-repo.git qui a également une taille de 205MB.

Que puis-je faire pour supprimer ces objets (vraisemblablement) non référencés du pack et ramener mon référentiel à la taille qu'il aurait eu s'il n'avait jamais été livré ? S'ils sont toujours référencés d'une manière ou d'une autre, y a-t-il un moyen de savoir où ?

Mise à jour

En essayant de réexécuter git filter-branch j'ai reçu cet avis :

Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f

J'ai vérifié qu'il y avait pas de réfs en .git/refs/original En effet, le répertoire n'existait pas du tout. Y a-t-il une autre façon pour git de stocker les références, que je ne connais pas ?

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