2009-08-01 10 views
48

En mi git repo personal, tengo un directorio que contiene miles de imágenes pequeñas que ya no se necesitan. ¿Hay alguna manera de eliminarlos de todo el historial de git? He tratadoEliminar un directorio permanentemente de git

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch imgs" HEAD 

y

git filter-branch --tree-filter 'rm -fr imgs' HEAD 

pero el tamaño del repositorio git se mantiene sin cambios. ¿Algunas ideas?

Gracias

+2

No estoy seguro, pero ¿has intentado ejecutar 'git gc' después? Tal vez todavía estén allí como basura ... –

+0

@Martinho: sí, soy – adk

+0

Tendrás que eliminar todas las referencias antiguas (por ejemplo, nombres de ramas, etiquetas), y luego puedes ejecutar 'git gc --aggressive'. – vdboor

Respuesta

15

En realidad ninguna de estas técnicas me workedfor. me pareció la más autorizada era simplemente tire localmente en otro repo:

git pull file://$(pwd)/myGitRepo 

También le ahorra la molestia de marcas viejas deletig.

ver la historia en mi blog: http://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/

+0

Este parece ser el trato más cercano para mí. He documentado los pasos específicos de Windows aquí: http: //www.somethingorothersoft.com/?p = 80 –

32

El libro ProGit tiene una interesante sección sobre Removing Object.

Se termina con esto:

Su historia ya no contiene una referencia a ese archivo.
Sin embargo, su reflog y un nuevo conjunto de refs que Git agregó cuando hizo el filter-branch en todavía lo tienen, por lo que debe eliminarlos y luego volver a empaquetar la base de datos. Es necesario deshacerse de cualquier cosa que tenga un puntero a esos viejos confirmaciones antes de volver a empacar:

$ rm -Rf .git/refs/original 
$ rm -Rf .git/logs/ 
$ git gc 
$ git prune --expire 

(git prune --expire no es obligatorio, pero puede extraer el contenido del directorio de los objetos sueltos)
copia de seguridad de todo antes de hacer esos comandos, por las dudas;)

+0

El enlace al libro ya no funciona :-( – rescdsk

+3

@rescdsk He restaurado el enlace – VonC

+0

¡Impresionante, gracias! – rescdsk

13

git-filter-branch guarda por defecto las referencias antiguas en refs/original/* namespace.

Es necesario eliminarlos, y luego hacer git gc --prune=now

3

Si quieres ir a la ruta limpieza manual, hay algunos archivos más que también pueden contener un árbitro la posición de su rama original antes de la git- rama de filtro. Por ejemplo, se filtró mi "casa" rama:

.git/info/árbitros:

179ad3e725816234a7182476825862e28752746d árbitros/Original/refs/heads/home

.git/envasados-refs:

179ad3e725816234a7182476825862e28752746d árbitros/originales/refs/heads/home

Después me quita esas líneas, gitk no mostró el viejo comete más.

+1

funcionó para mí, aunque me pregunto si esto acaba de arreglar la vista de gitk o si los refs serán realmente gc'd ahora – gravitation

10

Brandon Thomson preguntó en un comentario a la solución Rainer Blome 's si esto acaba de arreglar la vista gitk o si los árbitros será realmente se ha ido. Una buena manera de comprobar esto es para recordar a uno de los valores hash SHA1 (o un prefijo único de la misma) de los viejos compromete y tratar

$ git ls-tree hash-value 

Esto debería mostrar el contenido de los repositorios carpeta principal, ya que estaba en este compromiso. Después de

$ rm -Rf .git/refs/original 
$ rm -Rf .git/logs/ 

como se muestra por VonC y la eliminación de los refs/original/… líneas de .git/info/refs y .git/packed-refs como se muestra por Rainer Blome, una final

$ git gc --prune=now 

hizo no sólo las refs, pero también la edad los objetos (commits, árboles y blobs) desaparecen. El anterior git ls-tree hash-value lo demuestra. Otro buen comando para comprobar esto es git count-objects -v (ejecútelo antes del filtro-brach y después de la poda y compare el tamaño).

Nota: Como no tengo permitido comentar las otras respuestas, tuve que escribir una nueva, aunque combina principalmente las respuestas dadas anteriormente.

+0

Esta respuesta * parece * como la solución correcta para mí. Sin embargo, no entiendo por qué el tamaño total de mi repositorio no ha cambiado. – dbn

2

Como esta es una vieja pregunta, tal vez algo de esto no fue posible en aquel entonces. Esto también asume que estás usando bash o cygwin.

Advertencia: La segunda y la tercera líneas eliminarán de forma permanente todas las confirmaciones inalcanzables de sus ramas/etiquetas.

Después de ejecutar filter-branch, hacer

for ref in $(git for-each-ref --format='%(refname)' refs/original); do git update-ref -d $ref; done 
git reflog expire --expire=now --all 
git gc --prune=now 

git for-each-ref --format='%(refname)' obtiene los nombres de referencia, y git update-ref -d elimina la referencia. En general, es mejor no modificar la carpeta .git directamente, y en particular este comando maneja el caso cuando los refs están en packed-refs.

La segunda y tercera líneas se toman directamente de How to clean up unused side-branches in your commit trees?.

Cuestiones relacionadas