¿Cómo puedo limpiar mi carpeta .git? Limpié mi directory de proyectos, pero .git sigue siendo masivo

El directory de proyectos .git / objects en my rails sigue siendo enorme, después de eliminar cientos de megabytes de basura generada accidentalmente.

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

¿Qué puedo hacer para limpiar este directory?

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

  • Si agregaste los files, los git reset --hard HEAD^ y luego los git reset --hard HEAD^ con git reset --hard HEAD^ , están un poco más atascados. git fsck no listrá ningún commit o blobs que cuelguen , porque el reflog de su twig se está aferrando a ellos. Esta es una forma de garantizar que solo quedarán los objects que se encuentren en su historial:

     git reflog expire --expire=now --all git repack -ad # Remove dangling objects from packfiles git prune # Remove dangling loose objects 
  • Otra forma también es clonar el repository, ya que solo transportará los objects accesibles. Sin embargo, si los objects colgantes se empacaron (y si realizó muchas operaciones, es posible que git se haya empaquetado automáticamente), un clon local transportará todo el file de package:

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

    Debe especificar un protocolo para forzar a git a que calcule un nuevo package:

     git clone file://foo bar # good 

¿Has probado el command git gc ?

Sparkleshare creó 13GB de files 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 files.

Si todavía tiene un repository grande después de la poda y reempaquetado ( gc --aggressive --prune=tomorrow …) entonces simplemente puede search el que esté 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 list orderada de objects en tamaño ascendente. Puede usar git-filter-branch para eliminar al culpable de su repository.

Consulte "Eliminar objects" en http://progit.org/book/ch9-7.html para get ayuda.

Este es el command que utilicé para eliminar los files (utilicé la respuesta de Sehe para encontrar los culpables):

 git filter-branch --tree-filter 'rm -rf path/to/folder' HEAD 

Si necesita eliminar solo un file, puede hacer lo siguiente:

 git filter-branch --tree-filter 'rm filename' HEAD 

Fuente: eliminar permanentemente files y carpetas de un repository de git