¿Cuáles son los límites de files en Git (número y tamaño)?

¿Alguien sabe cuáles son los límites de Git para la cantidad de files y el tamaño de los files?

Este post del propio Linus puede ayudarte con algunos otros límites

[…] CVS, es decir, realmente termina siendo más o less orientado a un model de "un file a la vez".

Lo cual es bueno, ya que puedes tener un millón de files y luego ver solo algunos: nunca verás el impacto de los otros files 999.995.

Git fundamentalmente nunca mira a less que todo el repository. Incluso si limita un poco las cosas (es decir, echa un vistazo a solo una parte, o hace que la historia se retrase un poco), Git termina cuidando todo el asunto y llevando el conocimiento.

Así que git escala muy mal si lo obligas a mirar todo como un gran repository. No creo que esa parte sea realmente reparable, aunque probablemente podamos mejorarla.

Y sí, luego están los problemas del "file grande". Realmente no sé qué hacer con los files enormes. Nosotros los chupamos, lo sé.

Ver más en mi otra respuesta : el límite con Git es que cada repository debe representar un " set coherente de files ", el "todo sistema" en sí mismo (no puede labelr "parte de un repository").
Si su sistema está hecho de partes autónomas (pero interdependientes), debe usar submodules .

Como lo ilustra la respuesta de Talljoe , el límite puede ser uno del sistema (gran cantidad de files), pero si comprende la naturaleza de Git (sobre la coinheritance de datos representada por sus keys SHA-1), se dará count del verdadero "límite" es un uso uno: es decir, no debe tratar de almacenar todo en un repository de Git, a less que esté preparado para siempre get o labelr todo de nuevo. Para algunos proyectos grandes, no tendría sentido.


Para ver más a background los límites de git, consulte " git con files grandes "
(que menciona git-lfs : una solución para almacenar files grandes fuera del git repo. GitHub, abril de 2015)

Los tres problemas que limitan un repo de git:

  • files enormes (el file xdelta para packfile solo está en la memory, lo cual no es bueno con files grandes)
  • gran cantidad de files , lo que significa, un file por blob, y slow git gc para generar un file pack a la vez.
  • enormes files de package , con un índice de file de package ineficaz para recuperar datos del (enorme) file de package.

Un hilo más reciente (febrero de 2015) ilustra los factores limitantes para un repository de Git :

¿Algunos clones simultáneos del server central también ralentizarán otras operaciones simultáneas para otros usuarios?

No hay lockings en el server cuando se clona, ​​por lo tanto, en teoría, la clonación no afecta otras operaciones. Sin embargo, la clonación puede usar mucha memory (y mucha CPU a less que active la function de bitmap de accesibilidad, que debería).

¿' git pull ' será lento?

Si excluimos el lado del server, el tamaño de su tree es el factor principal , pero sus files de 25k deberían estar bien (Linux tiene 48k files).

' git push '?

Éste no se ve afectado por la profundidad de la historia de su repository ni por la amplitud de su tree, por lo que debe ser rápido.

Ah, el número de refs puede afectar tanto a git-push como a git-pull .
Creo que Stefan sabe mejor que yo en esta área.

' git commit '? (Aparece como lento en la reference 3 ) ¿ git status ? (Lento nuevamente en la reference 3 aunque no lo veo).
(también git-add )

De nuevo, el tamaño de tu tree. En el tamaño de su repository, no creo que deba preocuparse por eso.

Es posible que algunas operaciones no parezcan ser cotidianas, pero si son llamadas con frecuencia por el front-end web a GitLab / Stash / GitHub, etc., pueden convertirse en cuellos de botella. (por ejemplo, ' git branch --contains ' parece terriblemente afectado por un gran número de twigs).

git-blame podría ser lento cuando un file se modifica mucho.

No hay un límite real: todo se nombra con un nombre de 160 bits. El tamaño del file debe ser representable en un número de 64 bits, por lo que no hay límite real allí.

Sin embargo, hay un límite práctico. Tengo un repository que es ~ 8GB con> 880,000 y git gc toma un time. El tree de trabajo es bastante grande, por lo que las operaciones que inspeccionan todo el directory de trabajo toman bastante time. Sin embargo, este repository solo se usa para el almacenamiento de datos, por lo que solo se trata de un set de herramientas automatizadas que lo manejan. La extracción de cambios del repository es mucho, mucho más rápida que sincronizar los mismos datos.

 %find . -type f | wc -l 791887 %time git add . git add . 6.48s user 13.53s system 55% cpu 36.121 total %time git status # On branch master nothing to commit (working directory clean) git status 0.00s user 0.01s system 0% cpu 47.169 total %du -sh . 29G . %cd .git %du -sh . 7.9G . 

Si agrega files que son demasiado grandes (GB en mi caso, Cygwin, XP, 3 GB de RAM), espere esto.

fatal: falta memory, malloc falló

Más detalles aquí

Actualización 2/03/11: Vi similar en Windows 7 x64 con Tortoise Git. Toneladas de memory utilizadas, respuesta muy lenta del sistema.

En febrero de 2012, había un hilo muy interesante en la list de correo de Git de Joshua Redstone, un ingeniero de software de Facebook que probaba a Git en un enorme repository de testings:

El informe de testing tiene 4 millones de confirmaciones, historial lineal y aproximadamente 1,3 millones de files.

Las testings que se llevaron a cabo muestran que para tal repo, Git no se puede usar (operación en frío que durará minutos), pero esto puede cambiar en el futuro. Básicamente, el performance se penaliza por la cantidad de llamadas stat() al module kernel FS, por lo que dependerá de la cantidad de files en el repository y de la eficacia del almacenamiento en caching de FS. Ver también este Gist para mayor discusión.

Depende de cuál es tu significado. Hay límites de tamaño prácticos (si tiene muchos files grandes, puede ser aburrido). Si tiene muchos files, los escaneos también pueden ralentizarse.

Sin embargo, no hay límites inherentes al model. Ciertamente puedes usarlo pobremente y ser miserable.

Creo que es bueno evitar las asignaciones de files grandes como parte del repository (por ejemplo, un volcado de database puede ser mejor en otro lugar), pero si uno considera el tamaño del kernel en su repository, probablemente pueda esperar trabajar cómodamente. con algo más pequeño en tamaño y less complejo que eso.

Tengo una cantidad generosa de datos que se almacenan en mi repository como fragments JSON individuales. Hay unos 75,000 files en unos pocos directorys y no es realmente perjudicial para el performance.

Revisarlos en la primera vez fue, obviamente, un poco lento.

Encontré esto tratando de almacenar una gran cantidad de files (350k +) en un repository. Sí, almacenar. Risas.

 $ time git add . git add . 333.67s user 244.26s system 14% cpu 1:06:48.63 total 

Los siguientes extractos de la documentation de Bitbucket son bastante interesantes.

Cuando trabajas con un clonaje de repository DVCS, presionando, estás trabajando con todo el repository y todo su historial. En la práctica, una vez que su repository supera los 500 MB, puede comenzar a ver problemas.

… el 94% de los clientes de Bitbucket tienen repositorys que tienen less de 500 MB. Tanto el kernel de Linux como Android tienen less de 900 MB.

La solución recomendada en esa página es dividir su proyecto en trozos más pequeños.

git tiene un límite de 4G (32 bits) para el repository.

http://code.google.com/p/support/wiki/GitFAQ