2009-04-02 6 views
8

J'utilisecomment puis-je supprimer les objets indésirables de mon repo après filtre branche --subdirectory filtre

git filter-branch --subdirectory-filter dir/name -- --all 

pour construire une pension qui n'a que l'histoire se rapportant à ce répertoire/nom. Avant de faire le filtre, je clone le repo original (qui est beaucoup plus gros) dans un répertoire tmp. Après la branche de filtre, le repo regarde juste comme je le veux, à une exception près: Il semble toujours contenir tous les objets du repo original même s'ils ne sont pas montrés dans "git log". Comment puis-je supprimer complètement tous ces objets indésirables?

J'ai essayé des choses comme:

git reflog expire --expire=now --all 
git gc --aggressive --prune=now 

Il est clair pour moi que je ne sais pas pourquoi ils sont toujours là ou ce que cela signifie pour les enlever, mais je voudrais bien. Un peu d'information peut-être liée contre moi est que j'ai fait un repack git -a sur mon dépôt de la source il y a un certain temps et il semble copier ce fichier pack vers le nouveau repo. On dirait que je devrais encore être capable de faire ce que je veux bien.

Répondre

11

filtre branche conserve également refs de sauvegarde dans .git/refs/original, que vous aurez également à éliminer avant gc'ing

+2

Si c'est aussi simple que cela, je vais être un peu vexé. Dois-je littéralement juste .git/refs/original? – jettero

+0

Eh bien, le rm-ing fonctionne bien (même s'il y a un meilleur moyen) et cela répond totalement à ma question, merci. – jettero

+2

'rm' ne fonctionne que si GC n'a pas été exécuté, car GC déplace' refs' à 'packed-refs'. La bonne façon de supprimer les références d'origine sauvegardées par git-filter-branch serait «git for-each-ref --format ="% (refname) "refs/original/| xargs -n 1 git update-ref -d', comme indiqué dans la [documentation git-filter-branch] (http://git-scm.com/docs/git-filter-branch). @jettero – user