Cómo reducir la carpeta .git

134

Mi base actual tiene un tamaño total de aprox. 200MB.

Pero mi carpeta .git tiene un increíble tamaño de 5GB (!). Como llevo mi trabajo a un servidor externo, no necesito un gran historial local ...

¿Cómo puedo reducir la carpeta .git para liberar espacio en mi cuaderno? ¿Puedo eliminar todos los cambios que tienen más de 30 días?

Muchas gracias por cualquier ayuda :)

JMW
fuente
2
¿Puedes publicar la salida de git count-objects -v?
CB Bailey
2
Posible duplicado de Reducir el tamaño del repositorio git
sds

Respuestas:

113

no debe eliminar todos los cambios anteriores a 30 días (creo que de alguna manera es posible explotar git, pero realmente no se recomienda).

puede llamar git gc --aggressive --prune, que realizará la recolección de basura en su repositorio y podará los objetos viejos. ¿tiene muchos archivos binarios (archivos, imágenes, ejecutables) que cambian con frecuencia? generalmente llevan a enormes carpetas .git (recuerde, git almacena instantáneas para cada revisión y los archivos binarios se comprimen mal)

knittl
fuente
32
En realidad, git gc --aggressivese considera una mala práctica. Es mejor usarlo git repack -a -d --depth=250 --window=250.
Artefact2
18
@knittl: absolutamente. Aquí hay un mensaje del propio Linus: gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefact2
3
@ artefact2: gracias por el enlace! Lo he leído, y señala Linus, que --agresivo no reutilizará (buenos) deltas - que parecen no existir en esta pregunta, porque el repositorio es enorme. seguir el camino de reempaquetado en realidad llevará mucho más tiempo git gc --aggressivellama a reempaquetar con un tamaño de ventana de 250 (cf. página de manual) y una profundidad de 250 (cf. código fuente). --aggressive además agrega el -finterruptor, para tirar y rehacer todas las operaciones delta anteriores (como también se menciona en el enlace)
knittl
1
Acabo de ver el repositorio hg.nginx.org/nginx (RELEASE-1.4.0 es un consejo) usando git-remote-hg y esto arrojó un repositorio de aproximadamente 100 MB. El uso git gc --aggressive --pruneredujo esto a 19 MB.
Lekensteyn
15
@ Artefact2 Su estado de cuenta no está actualizado : tenga en cuenta la antigüedad de esa publicación. De hecho, el mismo día en que se publicó, la discusión en la lista de correo dio como resultado esta confirmación: [..] Por lo tanto, los parámetros de empaquetado son los mismos en estos días para cualquiera de los métodos. . --prunetampoco es necesario ya que se convirtió en el valor predeterminado desde entonces v1.5.5-rc0(commit 25ee973 , marzo de 2008).
Lekensteyn
68

Esto es lo que el creador de git Linus tiene que decir sobre cómo reducir su repositorio de git:

El equivalente de "git gc --aggressive" - ​​pero hecho * correctamente * - es hacer (de la noche a la mañana) algo como

   git repack -a -d --depth=250 --window=250

donde esa cosa de la profundidad se trata de cuán profundas pueden ser las cadenas delta (hacerlas más largas para la historia antigua, vale la pena el espacio de arriba), y la cosa de la ventana es sobre qué tan grande es la ventana de un objeto que queremos que escanee cada candidato delta.

Y aquí, es posible que desee agregar el indicador "-f" (que es "eliminar todos los deltas antiguos", ya que ahora está tratando de asegurarse de que este realmente encuentre buenos candidatos.

fuente: http://gcc.gnu.org/ml/gcc/2007-12/msg00165.html

¿Esto eliminará los datos binarios que quedan huérfanos en mi repositorio? "git repack" no eliminará imágenes o datos binarios que haya registrado en su repositorio y luego lo haya eliminado. Para eliminar ese tipo de datos permanentemente de su repositorio, debe volver a escribir su historial. Un ejemplo común de eso es cuando accidentalmente ingresas tus contraseñas en git. Puede regresar y eliminar algunos archivos, pero luego tiene que volver a escribir su historial desde entonces hasta ahora y luego forzar el envío y luego el nuevo repositorio a su origen.

David Dehghan
fuente
Para mí, la carpeta .git es de aproximadamente 1.5G. Intenté esto, pero recibí un error de seguimiento. fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
Miron
2
Después de ejecutar repacklocalmente, haciendo un commit y push, ¿el encogimiento se hará remoto también?
Timo
@David Dehghan: Hola, intenté esto desde el directorio del proyecto, pero el tamaño de la carpeta .git no cambió. ¿Se espera esto o necesito presionar para ver los cambios? (lo siento, no tengo mucha experiencia con git). Tengo una imagen / gif en repositorio y cometí varias veces versiones diferentes de esa imagen y supongo que eso aumentó el tamaño de .git.
giorgim
Hola, desafortunadamente así es como se limpia la versión binaria antigua. Para hacer eso, debes volver a escribir tu historial, que en realidad es complicado. Aquí hay algunas pistas
David Dehghan
22

Probé estos, pero mi repositorio todavía era muy grande. El problema era que accidentalmente había registrado algunos archivos grandes generados. Después de algunas búsquedas, encontré un gran tutorial que facilita la eliminación de los archivos generados de gran tamaño. Este tutorial me permitió reducir mi repositorio de 60 MB a <1 MB.

Steve Lorek, Cómo reducir un repositorio Git

Chris Hinshaw
fuente
44
Aquí hay una versión archivada en caso de rotura de enlaces. Esta respuesta es / fue útil para un repositorio que encontré donde se comprometieron archivos .exe y .zip que hincharon el tamaño de la carpeta .git
doubleDown
9

5GB vs 200MB es un poco raro. Intenta correr git gc.

Pero no, a menos que divida su repositorio en módulos, no puede disminuir el tamaño del .gitdirectorio.

Cada clon de un repositorio de git es un repositorio completo que puede actuar como un servidor. Ese es el principio básico del control de versiones distribuido.

Šimon Tóth
fuente
3

Estoy usando git más como mecanismo de sincronización que para el historial de versiones. Entonces, mi solución a este problema ha sido asegurarme de que tengo todas mis fuentes actuales en un estado satisfactorio, y luego simplemente eliminar .git y reinicializar los repositorios. Problema de espacio en disco resuelto. :-) Historial desaparecido :-( Hago esto porque mi repositorio está en una pequeña memoria USB. No quiero o necesito todo mi historial. Si tuviera un método para simplemente truncar el historial, lo usaría.

Si estuviera interesado en mantener mi historial, archivaría el repositorio actual. En algún momento más tarde podría clonar el repositorio original, copiar todos los cambios del nuevo repositorio (supongamos que no he cambiado mucho (ninguno) el cambio de nombre o la eliminación). Y luego haga una gran confirmación que represente todos los cambios realizados en el nuevo repositorio como una confirmación única en el antiguo repositorio. ¿Es posible fusionar las historias? Tal vez si usé una rama y luego eliminé los objetos que no necesitaba. (No sé lo suficiente sobre git internos para comenzar a perder el tiempo de esa manera).

Darrel Lee
fuente
1
En su lugar, podría usar Dropbox para este caso de uso. Lo hice por muchos años.
Jonny
0

Probé los métodos anteriores, nada funcionó en mi caso (donde accidentalmente eliminé el proceso de git durante git push), así que finalmente tuve que eliminar el repositorio y clonarlo nuevamente y ahora la carpeta .git es de tamaño normal.

JerryGoyal
fuente
Tuve que usar la misma solución porque mi disco estaba lleno (la carpeta .git era> 90 GB), ¡así que ni siquiera podía ejecutar un reempaque o git gc!
Fl4v