Comment nettoyer mon dossier .git? Nettoyé mon répertoire de projet, mais .git est encore massif

Le répertoire du projet .git / objects dans mes rails est encore massif, après la suppression de centaines de mégaoctets de déchets générés accidentellement.

J’ai essayé git add -A , ainsi que d’autres commandes pour mettre à jour l’index et supprimer les fichiers inexistants. Je suppose, peut-être à tort, que les fichiers avec deux noms de caractères dans le répertoire sont des blobs. J’ai essayé de revenir aux engagements précédents, mais pas de chance.

Que puis-je faire pour nettoyer ce répertoire?

  • Si vous avez ajouté les fichiers et que vous les avez supprimés, les blobs existent toujours mais restnt en suspens. git fsck listera les blobs inaccessibles, et git prune les supprimera.

  • Si vous avez ajouté les fichiers, les git reset --hard HEAD^ avec git reset --hard HEAD^ , ils sont un peu plus profonds. git fsck ne listera aucun commits ou blobs pendants, car le reflog de votre twig les retient . Voici une façon de vous assurer que seuls les objects de votre histoire restront:

     git reflog expire --expire=now --all git repack -ad # Remove dangling objects from packfiles git prune # Remove dangling loose objects 
  • Une autre méthode consiste également à cloner le référentiel, car cela ne transportera que les objects accessibles. Cependant, si les objects en suspens ont été compressés (et si vous avez effectué beaucoup d’opérations, git peut avoir été compressé automatiquement), un clone local portera l’intégralité du fichier de pack:

     git clone foo bar # bad git clone --no-hardlinks foo bar # also bad 

    Vous devez spécifier un protocole pour forcer git à calculer un nouveau pack:

     git clone file://foo bar # good 

Avez-vous essayé la commande git gc ?

Sparkleshare a créé 13 Go de fichiers tmp_pack_ dans mon git après avoir échoué à extraire de nombreuses fois des images énormes. La seule chose qui a aidé était …

 rm -f .git/objects/*/tmp_* 

‘git gc’ n’a pas supprimé ces fichiers.

Si vous avez encore un gros repo après élagage et reconditionnement ( gc --aggressive --prune=tomorrow …) alors vous pouvez simplement chercher l’ gc --aggressive --prune=tomorrow :

 git rev-list --objects --all | while read sha1 fname do echo -e "$(git cat-file -s $sha1)\t$\t$fname" done | sort -n 

Cela vous donnera une liste sortingée d’objects en taille croissante. Vous pouvez utiliser git-filter-branch pour supprimer le coupable de votre repo.

Voir “Suppression d’objects” dans http://progit.org/book/ch9-7.html pour plus d’informations.

Voici la commande que j’ai utilisée pour supprimer les fichiers (j’ai utilisé la réponse de sehe pour trouver les coupables):

 git filter-branch --tree-filter 'rm -rf path/to/folder' HEAD 

Si vous ne devez supprimer qu’un seul fichier, vous pouvez faire:

 git filter-branch --tree-filter 'rm filename' HEAD 

Source: supprime définitivement les fichiers et dossiers d’un repository git