¿Hay alguna manera de reducir el tamaño de la carpeta git?

156

Parece que mi proyecto es cada vez más grande con cada git commit/push. ¿Hay alguna manera de limpiar mi carpeta git?

Sheehan Alam
fuente

Respuestas:

214

No estoy seguro de lo que quieres. En primer lugar, por supuesto, cada vez que se compromete / empuje el directorio se hará un poco más grande, ya que tiene que almacenar cada uno de esos compromisos adicionales.

Sin embargo, probablemente desee git gclo que "limpiará los archivos innecesarios y optimizará el repositorio local" ( página del manual ).

Otro comando posiblemente relevante es el git cleanque eliminará los archivos no rastreados de su árbol ( página del manual ).

houbysoft
fuente
30
git clean -d -f -x elimina los archivos listados en .gitignore y tal. Por ejemplo, espacios de trabajo que no pertenecen a git, carpeta Pods, etc.
Kalle
102
WARNINGEl comando como se escribió anteriormente por @Kalle eliminará CADA > UNTRACKED <ARCHIVO Y DIRECTORIO DENTRO DE SU RAÍZ GIT , no solo "archivos listados en .gitignore". Cualquier cosa que Git no esté rastreando, independientemente de si está o no en la lista .gitignore, se eliminará. git clean -dfX(tenga en cuenta el caso en el X) solo eliminará los elementos que tengan una regla aplicable .gitignore. Tenga en cuenta esta advertencia: nunca ejecute git cleansin ejecutarlo en modo interactivo, con en -ilugar de -f, o al menos haciendo una ejecución en seco primero, -ny luego nuevamente con -f.
Adrian Günter
55
O haciendo una copia de seguridad :-)
Mateen Ulhaq
61

Correr:

git remote prune origin

Elimina todas las ramas de seguimiento obsoletas que ya se han eliminado originpero que aún están disponibles localmente en remotes/origin.

git gc --auto

' G arbage C ollection': ejecuta tareas de limpieza (comprime revisiones, elimina objetos sueltos / inaccesibles). El --autoindicador primero determina si se requiere algún trabajo y sale sin hacer nada si no es así.

phamductri
fuente
44
¿Alguna explicación de lo que hacen esos? Sé que podemos buscarlos en Google y buscar su documentación, pero es una práctica común proporcionar una breve descripción de su respuesta cuando se trata solo de código o comandos.
Dzhuneyt
28

Un escenario donde su repositorio git obtendrá serio más grande con cada confirmación es una de las que está cometiendo archivos binarios que se genera con regularidad. Su almacenamiento no será tan eficiente como el archivo de texto .

Otro es uno en el que tiene una gran cantidad de archivos dentro de un repositorio (que es un límite de git ) en lugar de varios subrepos ( administrados como submódulos ).

En este artículo sobre git space , AlBlue menciona:

Tenga en cuenta que Git (y Hg, y otros DVCS) sufren un problema en el que los archivos binarios (grandes) se registran, luego se eliminan, ya que aún se mostrarán en el repositorio y ocuparán espacio, incluso si no son actuales .

Si tiene grandes binarios almacenados en su repositorio de git, puede considerar:

Como mencioné en " ¿Cuáles son los límites de archivos en Git (número y tamaño)? ", El más reciente (2015, 5 años después de esta respuesta) Git LFS de GitHub es una forma de administrar esos archivos grandes (almacenándolos fuera del Repositorio de Git).

VonC
fuente
1
El soporte de archivos grandes de git es útil si tiene archivos binarios grandes (como imágenes) que se agregan / actualizan rutinariamente. Ver git-lfs.github.com . Súper fácil de implementar, compatible con github. Todos los miembros del equipo deben instalarlo para utilizarlo en colaboración.
Eric Woods, el
@EricWoods Verdadero. Mencioné Git-LFS antes (64 veces: stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ). He editado esta vieja respuesta en consecuencia.
VonC
Ja, de hecho! Es curioso cómo una respuesta de más de 9 años sigue siendo relevante (y ahora aún más con la información de LFS).
Eric Woods
22

si si, git gces la solución, naturalmente,

y localmente, simplemente puede eliminar el repositorio local y clonarlo nuevamente,

pero hay algo más importante aquí ...

los segundos que esperas para que ese gran git y externos se procesen se recogen en largos minutos en los que se recogen en horas de tiempo ineficiente,

Cree un nuevo repositorio (completamente, no solo una rama) desde cero , incluida la única versión reciente de archivos, naturalmente perderá todo el historial,

pero cuando en el mundo de los códigos no es hora de ponerse sentimental, no tiene sentido arrastrar los 5 años completos de código en cada commit o diff, aún puede almacenar los viejos git y externos en algún lugar, si siente nostalgia:]

pero, en algún momento, realmente tienes que avanzar:]

¡tu equipo te lo agradecerá!

Comunidad
fuente
12
Completamente de acuerdo, recientemente tomamos este enfoque con un antiguo repositorio y no hemos mirado atrás; bueno, principalmente porque no podemos, pero sabes a lo que me refiero :)
WhatIsHeDoing
13

Ejecutar este comando es extremadamente peligroso, pero reducirá su repositorio al borrar todos sus archivos de recuperación / copia de seguridad de git:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

Borrará todos los archivos que git usa para recuperar su repositorio de algún comando incorrecto, por ejemplo, si lo hizo git reset --hard, generalmente puede recuperar los archivos perdidos. Pero si lo haces git reset --hardantes del git reflog expire...comando, entonces lo perdiste todo. Ahora, su única esperanza es utilizar alguna herramienta que analice su sistema de archivos e intente recuperar los archivos borrados, si no fueron anulados.

usuario
fuente
3
Realmente no llamaría a esto extremadamente peligroso . Simplemente lo etiquetaría como algo con lo que debes tener cuidado . En mi experiencia, muy pocos tocan el reflog o los objetos inalcanzables; la mayoría ni siquiera sabe que están allí o cómo interactuar con ellos, y se quedan atrapados en situaciones en las que serían útiles, o hacen las cosas terriblemente manera ineficiente Llegaría al extremo de decir que si no sabe y no puede entender qué harán estos comandos, ¡puede ejecutarlos de forma segura!
Chris Morgan
10

git clean -d -f -i Es la mejor manera de hacerlo.

Esto ayudará a limpiar de una manera más controlada.

-i significa interactivo.

anandharshan
fuente
3
Si bien la pregunta del OP es vaga, y esta es una buena respuesta a ese respecto, quiero señalar que git cleanno es tanto para limpiar el repositorio como para limpiar el directorio. Para los usuarios que copian / pegan ciegamente, tengan cuidado; Esto elimina los archivos / directorios no rastreados que realmente podría desear localmente.
sraboy 01 de
git clean -d -x -f funciona muy bien si quieres limpiar a fondo
Rishabh Jain
2

No sé si lo reducirá, pero después de ejecutarlo git clean, a menudo también lo hago git repack -ad, lo que reduce la cantidad de archivos de paquete.

Damien Sawyer
fuente
55
el reempaquetado es parte del git gcproceso, por lo que no es necesario ejecutarlo por separado
artkoshelev