2009-04-02 12 views
8

estoy usando¿Cómo puedo eliminar los objetos no deseados en mi repo después filter-branch---subdirectory filtro

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

para construir un acuerdo de recompra que sólo tiene historia relativa a ese dir/nombre. Antes de hacer el filtro, clono el repositorio original (que es mucho más grande) en un dir de tmp. Después de la rama de filtro, el repositorio se ve exactamente como lo quiero, con una excepción: parece que todavía contiene todos los objetos del repositorio original a pesar de que no se muestran en "registro de git".

¿Cómo puedo eliminar por completo todos esos objetos no deseados?

He intentado cosas como:

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

Es claro para mí que no sé por qué están todavía allí o lo que significa para eliminarlos, pero estoy seguro que le gustaría. Un poco de información posiblemente relacionada que trabaja en mi contra es que había hecho un paquete de git -a en mi repositorio de origen hace un tiempo y parece copiar ese archivo de paquete en el nuevo repositorio. Parece que todavía debería ser capaz de hacer lo que quiero.

Respuesta

11

filter-branch también mantiene árbitros de copia de seguridad en .git/refs/original, que también tendrá que quitar antes de gc'ing

+2

Si es así de simple Voy a ser un poco molesto. ¿Literalmente simplemente rm .git/refs/original? – jettero

+0

Bueno, rm-ing sí funciona (incluso si hay una manera mejor) y esto responde totalmente mi pregunta, gracias. – jettero

+2

'rm' funciona solo si no se ejecutó GC, ya que GC mueve' refs' a 'packed-refs'. La forma correcta de eliminar los refs originales respaldados por git-filter-branch sería 'git for-each-ref --format ="% (refname) "refs/original/| xargs -n 1 git update-ref -d', como se indica en [documentación de git-filter-branch] (http://git-scm.com/docs/git-filter-branch). @jettero – user

Cuestiones relacionadas