repositorio quitar proyecto eliminar directorio como borrar archivos git

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, su reflog y un nuevo conjunto de referencias que Git agregó cuando hizo la filter-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;)



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.