2011-03-11 10 views
53

El .git/objects en mi directorio de proyectos de rieles sigue siendo enorme, después de eliminar cientos de Megabytes de basura generada accidentalmente.¿Cómo puedo limpiar mi carpeta .git? Limpié mi directorio de proyectos, pero .git sigue siendo masivo

He intentado git add -A, así como otros comandos para actualizar el índice y eliminar archivos inexistentes. Deduzco, quizás incorrectamente, que los archivos con dos nombres de caracteres en el directorio son blobs. He intentado retroceder a las confirmaciones anteriores, pero no tuve suerte.

¿Qué puedo hacer para limpiar este directorio?

Respuesta

81
  • Si agregó los archivos y luego los quitó, los blobs aún existen pero están colgando. git fsck listará blobs inalcanzables, y git prune los eliminará.

  • Si agregó los archivos, los comprometió y luego los retrotrayó con git reset --hard HEAD^, están un poco más atascados. git fsck no mostrará ninguna confirmación o blobs que cuelguen, porque la rama reflog se aferrará a ellos. Aquí está una manera de asegurar que sólo los objetos que se encuentran en su historia propiamente dicha se mantendrán:

    git reflog expire --expire=now --all 
    git repack -ad # Remove dangling objects from packfiles 
    git prune  # Remove dangling loose objects 
    
  • Otra forma es también para clonar el repositorio, como que sólo llevará a los objetos que son accesibles. Sin embargo, si los objetos que cuelgan estaba hasta los topes (y si ha realizado muchas operaciones, git bien puede haber embalado de forma automática), entonces un clon local llevar a toda la PACKFILE:

    git clone foo bar     # bad 
    git clone --no-hardlinks foo bar # also bad 
    

    Debe especificar un protocolo para forzar a git a calcular un nuevo paquete:

    git clone file://foo bar # good 
    
+0

Sí, me comprometí antes de darme cuenta del problema. Intenté todo menos el último comando. Cuando ejecuto esto desde el directorio de mi proyecto "warning: Parece que ha clonado un repositorio vacío". He estado leyendo la documentación, pero es algo pesado. ¿Cómo puedo apuntar clonar a la fuente correcta? – light24bulbs

+1

@user El URL 'file: // foo' es relativo al directorio actual, y un' file: /// home/me/foo' (tres barras) es absoluto. –

+0

gracias! eso se reduce a la mitad, pero mi paquete sigue siendo diez veces más grande que el resto del repositorio. He intentado podar .. – light24bulbs

4

Si todavía tiene una gran cesión temporal después de la poda y volver a embalar (gc --aggressive --prune=tomorrow ...), entonces puede simplemente ir a buscar el impar hacia fuera:

git rev-list --objects --all | 
    while read sha1 fname 
    do 
     echo -e "$(git cat-file -s $sha1)\t$\t$fname" 
    done | sort -n 

Esto le dará una lista ordenada de objetos en tamaño ascendente. Puede usar git-filter-branch para eliminar al culpable de su repositorio.

Ver "Eliminación de objetos" en http://progit.org/book/ch9-7.html de orientación

+0

@DavidJames gracias por la pista. Lo hice aún más legible, IMO – sehe

+0

Por si acaso alguien se tropieza con esto: hay un error tipográfico en los argumentos entre paréntesis: debe ser '--aggressive'. Intenté editar, pero resulta que no puedes editar un error tan pequeño. – hellobenallan

+0

@hellobenallan gracias por la nota, [fijo] (http://stackoverflow.com/posts/5293344/revisions) – sehe

7

Sparkleshare creó 13GB de archivos tmp_pack_ en mi git después de no poder tirar muchas veces de una enorme captura de imágenes. Lo único que ayudó fue ...

rm -f .git/objects/*/tmp_* 

'git gc' no eliminó esos archivos.

+0

Esa es una bonita solución de fuerza bruta, pero no veo ninguna razón por la que no funcione. ¡Bonito! – light24bulbs

+0

Las situaciones desesperadas requieren medidas desesperadas. ¡Funcionó como un amuleto! Tks. – medina

Cuestiones relacionadas