tipos tag remove qué practices log existen etiquetas crear best git

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



qué tipos de etiquetas existen en git (10)

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



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


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

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


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

El informe de prueba tiene 4 millones de confirmaciones, historial lineal y aproximadamente 1,3 millones de archivos.

Las pruebas 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 rendimiento se penaliza por la cantidad de llamadas stat() al módulo kernel FS, por lo que dependerá de la cantidad de archivos en el repositorio y de la eficacia del almacenamiento en caché de FS. Ver también este Gist para mayor discusión.


Encontré esto tratando de almacenar una gran cantidad de archivos (350k +) en un repositorio. 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 Bitbucket son bastante interesantes.

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

... el 94% de los clientes de Bitbucket tienen repositorios de menos de 500 MB. Tanto el kernel de Linux como Android tienen menos de 900 MB.

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


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

[...] CVS, es decir, realmente termina siendo más o menos orientado a un modelo de "un archivo a la vez".

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

Git fundamentalmente nunca mira a menos que todo el repositorio. 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 repositorio. No creo que esa parte sea realmente reparable, aunque probablemente podamos mejorarla.

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

Ver más en mi otra respuesta : el límite con Git es que cada repositorio debe representar un " conjunto coherente de archivos ", el "todo sistema" en sí mismo (no puede etiquetar "parte de un repositorio").
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 archivos), pero si comprende la naturaleza de Git (sobre la coherencia de datos representada por sus claves SHA-1), se dará cuenta del verdadero "límite" es un uso uno: es decir, no debe tratar de almacenar todo en un repositorio de Git, a menos que esté preparado para siempre obtener o etiquetar todo de nuevo. Para algunos proyectos grandes, no tendría sentido.

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

Los tres problemas que limitan un repo de git:

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

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

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

No hay bloqueos en el servidor cuando se clona, ​​por lo tanto, en teoría, la clonación no afecta otras operaciones. Sin embargo, la clonación puede usar mucha memoria (y mucha CPU a menos que active la función de mapa de bits de accesibilidad, que debería).

¿'' git pull '' será lento?

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

'' git push ''?

Éste no se ve afectado por la profundidad de la historia de su repositorio ni por la amplitud de su árbol, 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 referencia 3 ) ¿ git status ? (Lento nuevamente en la referencia 3 aunque no lo veo).
(también git-add )

De nuevo, el tamaño de tu árbol. En el tamaño de su repositorio, 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 ramas).

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


No hay un límite real: todo se nombra con un nombre de 160 bits. El tamaño del archivo 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 repositorio que es ~ 8GB con> 880,000 y git gc toma un tiempo. El árbol de trabajo es bastante grande, por lo que las operaciones que inspeccionan todo el directorio de trabajo toman bastante tiempo. Sin embargo, este repositorio solo se usa para el almacenamiento de datos, por lo que solo se trata de un conjunto de herramientas automatizadas que lo manejan. La extracción de cambios del repositorio 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 archivos que son demasiado grandes (GB en mi caso, Cygwin, XP, 3 GB de RAM), espere esto.

fatal: falta memoria, malloc falló

Más detalles here

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


Tengo una cantidad generosa de datos que se almacenan en mi repositorio como fragmentos JSON individuales. Hay unos 75,000 archivos en unos pocos directorios y no es realmente perjudicial para el rendimiento.

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