81 votos

git es muy muy lento

Mi proyecto es de seis meses de edad y git es muy, muy lento. Hacemos un seguimiento de alrededor de 30 archivos que son de un tamaño de 5 MB a 50 MB. Esos son los archivos binarios y los mantenemos en git. Yo creo que esos archivos están haciendo git lento.

Hay una forma para matar a todos los archivos de tamaño > 5 MB desde el repositorio. Sé que me gustaría perder todos estos archivos y que es bueno conmigo.

Idealmente me gustaría un comando que lista todos los archivos de gran tamaño ( > 5 MB) . Puedo ver la lista y luego me dicen que está bien seguir adelante y eliminar esos archivos y hacer git más rápido.

Debo mencionar que git es lento no sólo en mi máquina, pero la implementación de la aplicación en el entorno de ensayo es que ahora toma alrededor de 3 horas.

Por lo que la solución debe ser algo que va a afectar el servidor y no sólo los usuarios del repositorio.

122voto

kubi Puntos 20607

¿Hacer recogen basura?

git gc

Esto hace una diferencia significativa en la velocidad, incluso para pequeñas repos.

76voto

Andres Jaan Tack Puntos 9929

Explicación

Git es realmente bueno, a grandes historias de pequeños archivos de texto debido a que se pueden almacenar a ellos y a sus cambios de manera eficiente. Al mismo tiempo, git es muy malo en archivos binarios, y se ingenuamente almacenar por separado las copias del archivo (por defecto, al menos). El repositorio obtiene enorme, y entonces se vuelve lento, como usted ha observado.

Este es un problema común entre los DVCS, agravado por el hecho de que la descarga de todas las versiones de cada archivo ("el repositorio") cada vez que el clon. Los chicos en el Horno están trabajando en un plugin para el tratamiento de estos archivos de gran tamaño más como Subversión, que sólo las descargas de versiones históricas en la demanda.

Solución

Este comando lista todos los archivos en el directorio actual de tamaño >= 5 MB.

find . -size +5000000c 2>/dev/null -exec ls -l {} \;

Si desea quitar los archivos de toda la historia del repositorio, puede utilizar esta idea con git filter-branch a caminar por la historia y deshacerse de todos los rastros de archivos de gran tamaño. Después de hacer esto, todos los nuevos clones de el repositorio será más delgado. Si desea lean-un repositorio sin la clonación, usted encontrará las direcciones en la página man (consulte "Lista de comprobación para la Reducción del tamaño del Repositorio").

git filter-branch --index-filter \
    'find . -size +5000000c 2>/dev/null -exec git rm --cached --ignore-unmatch {} \;'

Una palabra de advertencia: esto hará que su repositorio incompatible con otros clones, ya que los árboles y los índices de archivos diferentes facturado; usted no será capaz de empujar o tirar de ellos nunca más.

17voto

John Puntos 119

Aquí es un censurado revisión destinado a ser menos negativos e inflamatorias:

Git tiene un conocido la debilidad cuando se trata de archivos que no son de la línea-por-línea de archivos de texto. Actualmente no hay solución, y no hay planes anunciados por el núcleo git equipo de dirección este. Hay soluciones, si su proyecto es pequeño, digamos, de 100 MB o menos. Existen ramas de git proyecto para abordar este problema de escalabilidad, pero estas ramas no son maduros en este momento. Algunos otros sistemas de control de revisiones no tienen este problema específico. Usted debe considerar este problema como uno de los muchos factores al decidir si selecciona git como su sistema de control de revisiones.

15voto

martin Puntos 141

No hay nada específico acerca de los archivos binarios y de la manera de git, es el manejo de ellos. Cuando se agrega un archivo a un repositorio de git, un encabezado es un añadido y el archivo está comprimido con zlib y cambió de nombre después de que el hash SHA1. Este es exactamente el mismo independientemente del tipo de archivo. No hay nada en la compresión zlib que hace difícil para los archivos binarios.

Pero en algunos puntos (empujar, gc) Git empezar a mirar la posibilidad de delta comprimir contenido. Si git encontrar los archivos que son similares (nombre de archivo, etc) es ponerlos en la memoria RAM y se empieza a comprimir ellos juntos. Si usted tiene 100 de los archivos y cada uno de ellos arr decir 50Mb intentará poner de 5 gb en la memoria al mismo tiempo. A esto tienes que añadir un poco más para hacer que las cosas funcionen. El equipo puede no tener esta cantidad de RAM y comienza a cambiar. El proceso toma tiempo.

Usted puede limitar la profundidad de la compresión delta, de modo que el proceso no utiliza esa cantidad de memoria, pero el resultado es menos eficiente de compresión. (core.bigFileThreshold, delta atributo, pack.ventana, pack.la profundidad, el pack.windowMemory etc)

Así hay muchos piensa que usted puede hacer para hacer git funcionan muy bien con archivos de gran tamaño.

6voto

David Puntos 41

Una manera de acelerar las cosas es usar el --depth 1 bandera. Vea la página man para obtener más detalles. Yo no soy un gurú git grandes pero creo que esto dice hacer el equivalente de un p4 get o un svn get , es decir darle sólo los últimos archivos solamente en vez de "dan todas las revisiones de todos los archivos a través de todo tiempo" Qué es lo que git clone hace.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X