git es muy, muy lento al rastrear grandes files binarys

Mi proyecto tiene seis meses y git es muy lento. Realizamos un seguimiento de alnetworkingedor de 30 files que tienen un tamaño de 5 MB a 50 MB. Esos son files binarys y los guardamos en git. Creo que esos files están haciendo lento el process.

¿Hay alguna forma de eliminar todos los files de tamaño> 5MB del repository? Sé que perdería todos estos files y está bien para mí.

Idealmente, me gustaría un command que enumere todos los files grandes (> 5 MB). Puedo ver la list y luego digo "ok", adelante, elimine esos files y haga que git sea más rápido.

Debo mencionar que el git es lento no solo en mi máquina, sino que la implementación de la aplicación en el entorno de testing ahora demora alnetworkingedor de 3 horas.

Entonces, la solución debería ser algo que afectará al server y no solo a los usuarios del repository.

¿Recoges basura?

 git gc 

Esto hace una diferencia significativa en la velocidad, incluso para pequeños repositorys.

Explicación

Git es realmente bueno en historias enormes de pequeños files de text porque puede almacenarlos y sus cambios de manera eficiente. Al mismo time, git es muy malo en los files binarys, y almacenará ingenuamente copys separadas del file ( por defecto, al less ). El repository se vuelve enorme, y luego se vuelve lento, como habrás observado.

Este es un problema común entre los DVCS, exacerbado por el hecho de que descarga cada versión de cada file ("el repository completo") cada vez que lo clona. Los chicos de Kiln están trabajando en un complemento para tratar estos files grandes más como Subversion, que solo descarga versiones históricas a pedido.

Solución

Este command listrá todos los files bajo el directory actual de tamaño> = 5MB.

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

Si desea eliminar los files de todo el historial del repository, puede usar esta idea con git filter-branch para recorrer el historial y deshacerse de todos los rastros de files de gran tamaño. Después de hacer esto, todos los clones nuevos del repository estarán más ágiles. Si desea astackr un repository sin clonar, encontrará las instrucciones en la página del manual (consulte "Lista de verificación para networkingucir el tamaño de un repository").

 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 repository sea incompatible con otros clones, porque los treees y los índices tienen diferentes files registrados; ya no podrás empujarlos o jalar de ellos.

Aquí hay una revisión censurada que pretende ser less negativa e inflamatoria:

Git tiene una debilidad bien conocida cuando se trata de files que no son files de text línea por línea. Actualmente no hay solución, y no hay planes anunciados por el equipo core git para abordar esto. Hay soluciones temporales si su proyecto es pequeño, digamos, 100 MB o less. Existen twigs del proyecto git para abordar este problema de escalabilidad, pero estas twigs no están maduras en este momento. Algunos otros sistemas de control de revisión no tienen este problema específico. Debería considerar este problema como uno de muchos factores a la hora de decidir si selecciona git como su sistema de control de revisiones.

No hay nada específico sobre los files binarys y la forma en que los maneja. Cuando agrega un file a un repository git, se agrega un encabezado y el file se comprime con zlib y se renombra después del hash SHA1. Esto es exactamente lo mismo independientemente del tipo de file. No hay nada en la compression de zlib que lo haga problemático para los files binarys.

Pero en algunos puntos (empujando, gc) Git comienza a ver la posibilidad de comprimir el contenido delta. Si git encuentra files que son similares (nombre de file, etc.), los pone en la memory RAM y comienza a comprimirlos juntos. Si tiene 100 files y cada uno de ellos arr dig 50Mb intentará poner 5GB en la memory al mismo time. Para esto, debes agregar algo más para que las cosas funcionen. Es posible que su computadora no tenga esta cantidad de RAM y comience a intercambiarse. El process lleva time.

Puede limitar la profundidad de la compression delta para que el process no utilice tanta memory, pero el resultado es una compression less eficiente. (core.bigFileThreshold, delta attribute, pack.window, pack.depth, pack.windowMemory, etc.)

Así que hay muchas cosas que puedes hacer para que git funcione muy bien con files grandes.

Una forma de acelerar las cosas es usar la bandera --depth 1 . Vea la página de manual para más detalles. No soy un gran gurú de git pero creo que esto equivale a p4 get un p4 get o un svn get , es decir, solo le doy los últimos files en lugar de "darme todas las revisiones de todos los files a través de todo time "que es lo que hace el git clone .

¿Has dicho que esos files son binarys?

por ejemplo, agregado *.ext binary a los *.ext binary de su repository

También puede considerar BFG Repo Cleaner como una forma más rápida y fácil de limpiar files grandes.

https://rtyley.github.io/bfg-repo-cleaner/

He estado ejecutando Git desde 2008 tanto en Windows como en GNU / Linux y la mayoría de los files que rastreo son files binarys. Algunos de mis repos son varios GB y contiene Jpeg y otros medios. Tengo muchas computadoras tanto en casa como en el trabajo ejecutando Git.

Nunca he tenido los síntomas que se describen en la publicación original. Pero hace solo un par de semanas instalé MsysGit en una vieja computadora portátil Win-XP y casi todo lo que hice, detuvo a Git. Incluso la testing con solo dos o tres files de text pequeños fue ridículamente lenta. Estamos hablando de 10 minutos para agregar un file de less de 1k … parece que los processs de git se mantuvieron vivos para siempre. Todo lo demás funcionó como se esperaba en esta computadora.
Bajé de la última versión a 1.6 algo y los problemas desaparecieron …
Tengo otras computadoras portátiles de la misma marca, también con Win-XP instalado por el mismo departamento de TI de la misma image, donde Git funciona bien independientemente de la versión … Por lo tanto, debe haber algo extraño en esa computadora en particular.

También hice algunas testings con files binarys y compression. Si tienes una image BMP y le haces pequeños cambios y los cometes, git gc se comprimirá muy bien. Entonces mi conclusión es que la compression no depende de si los files son binarys o no.

Simplemente configure los files para ignorarlos. Ver el siguiente enlace:

http://help.github.com/git-ignore/

Eso es porque git no es escalable.

Esta es una seria limitación en git que se ve ahogada por la defensa de git. Busque en las lists de distribución de git y encontrará cientos de usuarios que se preguntan por qué solo unos escasos 100 MB de imágenes (por ejemplo, para un website o aplicación) ponen de rodillas a git. El problema parece ser que casi todos los git dependen de una optimization a la que se refieren como "embalaje". Desafortunadamente, el empaquetado es ineficiente para todos, excepto para los files de text más pequeños (es decir, el código fuente). Peor aún, crece cada vez less eficiente a medida que la historia aumenta.

Es realmente un defecto embarazoso en git, que se promociona como "rápido" (a pesar de la falta de testings), y los desarrolladores de git lo saben muy bien. ¿Por qué no lo arreglaron? Encontrará respuestas en la list de correo de git de los desarrolladores de git que no reconocerán el problema porque los documentos de Photoshop (* .psd) son de formatting propietario. Sí, es realmente tan malo.

Aquí está el resultado:

Use git para proyectos pequeños con código fuente para los cuales no tiene ganas de configurar un repository por separado. O para pequeños proyectos de código fuente en los que desee aprovechar el model de desarrollo descentralizado de git copy-the-entire-repo. O cuando simplemente quiere aprender una nueva herramienta. Todas estas son buenas razones para usar git, y siempre es divertido aprender nuevas herramientas.

No use git si tiene una gran base de código, binarys, gran historial, etc. Solo uno de nuestros repos es un TB. Git no puede manejarlo. VSS, CVS y SVN lo manejan bien. (SVN se hincha, sin embargo)

Además, dale time a Git para madurar. Todavía es inmaduro, pero tiene mucho impulso. Con el time, creo que la naturaleza práctica de Linus superará a los puristas de OSS, y git eventualmente será utilizable en el campo más amplio.