quitar - Eliminar un directorio permanentemente de git
eliminar repositorio git (6)
En mi repositorio personal de git, tengo un directorio que contiene miles de imágenes pequeñas que ya no son necesarias. ¿Hay alguna manera de eliminarlos de todo el historial de git? Yo he tratado
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 de git permanece sin cambios. ¿Algunas ideas?
Gracias
Como esta es una vieja pregunta, tal vez algo de esto no fue posible en ese entonces. Esto también supone que estás usando bash o cygwin.
Advertencia: la segunda y tercera líneas eliminarán de forma permanente todas las confirmaciones inalcanzables de sus sucursales / etiquetas.
Después de ejecutar filter-branch
, haz
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ínea se toman directamente de Cómo limpiar las ramas laterales no utilizadas en sus árboles de compromiso? .
El libro ProGit tiene una sección interesante sobre la eliminación de objetos .
Se termina con esto:
Tu historial ya no contiene una referencia a ese archivo.
Sin embargo, sureflog
y un nuevo conjunto de referencias que Git agregó cuando hizo lafilter-branch
bajo.git/refs/original
todavía lo hacen, por lo que debe eliminarlos y luego volver a empaquetar la base de datos. Debe deshacerse de cualquier cosa que tenga un puntero a esas confirmaciones anteriores antes de volver a empaquetar:
$ rm -Rf .git/refs/original
$ rm -Rf .git/logs/
$ git gc
$ git prune --expire
( git prune --expire
no es obligatorio pero puede eliminar el contenido del directorio de los objetos sueltos)
Copia de seguridad de todo antes de hacer esos comandos, por si acaso;)
En realidad ninguna de estas técnicas funcionó para mí. Encontré que lo más confiable era simplemente tirar localmente a otro repositorio:
git pull file://$(pwd)/myGitRepo
También le ahorra la molestia de eliminar etiquetas antiguas.
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/
Si desea ir a la ruta de limpieza manual, hay algunos archivos más que también pueden contener una referencia a la posición de su rama original antes de la rama-filtro-git. Por ejemplo, filtré mi rama "casera":
.git / info / refs:
179ad3e725816234a7182476825862e28752746d refs / original / refs / heads / home
.git / empaquetado-refs:
179ad3e725816234a7182476825862e28752746d refs / original / refs / heads / home
Después de que quité esas líneas, gitk no mostró más los antiguos compromisos.
git-filter-branch por defecto guarda las referencias antiguas en refs/original/*
namespace.
Necesitas eliminarlos, y luego hacer git gc --prune=now
Brandon Thomson preguntó en un comentario a la solución de Rainer Blome si esto solo arreglaba la vista de gitk o si los refs realmente desaparecerían. Una buena manera de verificar esto es recordar uno de los hashes sha1 (o un prefijo único de ellos) de los antiguos confirmaciones y probar
$ git ls-tree hash-value
Esto debería mostrarle el contenido de la carpeta principal de repos como estaba en esta confirmación. Después
$ rm -Rf .git/refs/original
$ rm -Rf .git/logs/
como lo muestra VonC y eliminando las líneas refs refs/original/…
de .git/info/refs
y .git/packed-refs
como lo muestra Rainer Blome , un final
$ git gc --prune=now
no solo los refs, sino también los objetos antiguos (commit, árboles y blobs) desaparecen. El git ls-tree hash-value
mostrado anteriormente prueba esto. Otro comando agradable para verificar esto es git count-objects -v
(ejecutarlo antes del filtro-brach y después de la poda y comparar el tamaño).
Nota: como aún no tengo permiso para comentar sobre las otras respuestas, tuve que escribir una nueva, aunque principalmente combina respuestas anteriores.