Quelles sont les limites des fichiers en Git (nombre et taille)?
10 réponses
ce message de Linus lui-même peut vous aider avec d'autres limites
[...] CVS, c'est-à-dire qu'il finit vraiment par être plutôt orienté vers un "fichier unique" à un moment".
ce qui est agréable en ce que vous pouvez avoir un million de fichiers, et puis seulement vérifier de quelques-uns d'entre eux - vous ne serez jamais la même voir l'impact de l'autre 999,995 fichiers.
Git fondamentalement jamais vraiment regarde de moins que l'ensemble des pensions. Même si vous limiter les choses un peu (c'est-à-dire vérifier juste une partie, ou avoir l'histoire aller Retour Juste un peu), git finit toujours par se soucier de toute la chose, et de transporter le savoir.
Donc git échelles vraiment mal si vous forcer à regarder tout ce que l'on énorme "1519180920 référentiel". Je ne pense pas que cette partie est vraiment réparable, bien que nous peut probablement améliorer il.
et oui, il y a les problèmes de" gros dossier". Je ne sais vraiment pas quoi faire à propos des fichiers énormes. Nous sucer à eux, je sais.
voir plus dans mon autre réponse : la limite avec Git est que chaque dépôt doit représenter un " ensemble cohérent de fichiers ", le" tout système "en lui-même (vous ne pouvez pas étiqueter"partie d'un dépôt").
Si votre système est constitué de pièces autonomes (mais interdépendantes), vous devez utiliser sous-modules .
comme illustré par réponse de Talljoe , la limite peut être un système un (grand nombre de fichiers), mais si vous comprenez la nature de Git (à propos de la cohérence des données représentées par ses touches SHA-1), vous vous rendrez compte que la vraie" limite "est un usage un: I. e, vous ne devriez pas essayer de stockez tout dans un dépôt Git, à moins que vous ne soyez prêt à toujours récupérer ou étiqueter tout. Pour certains grands projets, cela n'aurait aucun sens.
Pour un regard plus en profondeur à git limites, voir " git avec de gros fichiers "
(qui mentionne git-lfs " une solution pour stocker de grands fichiers en dehors de la git repo. GitHub, Avril 2015)
Les trois questions que les limites d'un repo git:
- gros fichiers (le xdelta pour packfile est uniquement en mémoire, ce qui n'est pas bonne avec de gros fichiers)
- un grand nombre de fichiers , ce qui signifie, un fichier par blob, et un git gc lent pour générer un fichier Pack à la fois.
- énormes paquets , avec un index packfile inefficace pour récupérer des données à partir du (énorme) packfile.
un fil plus récent (fév. 2015) illustre les facteurs limitatifs pour un git repo :
est-ce que quelques clones simultanés du serveur central vont également ralentir d'autres opérations simultanées pour d'autres utilisateurs?
Il n'y a pas de serrure dans le serveur lors du clonage, donc en théorie le clonage n'affecte pas les autres opérations. Le clonage peut utiliser beaucoup de mémoire (et beaucoup de cpu, sauf si vous tournez sur l'accessibilité bitmap fonction, qui doit).
git pull
" sera lent?si nous excluons le côté serveur, la taille de votre arbre est le facteur principal , mais vos fichiers 25k devraient être très bien (linux a 48k fichiers).
git push
"?celui-ci n'est pas affecté par la profondeur de l'histoire de votre repo, ou la largeur de votre arbre, donc devrait être rapide..
Ah le nombre de réf peut affecter à la fois
git-push
etgit-pull
.
Je pense que Stefan sait mieux que moi dans ce domaine.
git commit
"? (Il est répertorié comme lent dans "15191150920 de référence pour le" 3 .)git status
? (Ralentis à nouveau dans la référence 3 même si Je ne le vois pas.)
(aussigit-add
)Encore une fois, la taille de votre arbre. À la taille de votre banque, Je ne pense pas que vous ayez besoin de vous en inquiéter.
certaines opérations peuvent ne pas sembler être quotidiennes, mais si elles sont appelées fréquemment par le web front-end à GitLab / Stash/GitHub etc alors ils peuvent devenir des goulots d'étranglement. (par exemple
git branch --contains
" semble terriblement affecté par un grand nombre de branches.)
git-blame
peut être lent quand un fichier est modifié beaucoup.
il n'y a pas de limite réelle -- tout est nommé avec un nom de 160 bits. La taille du fichier doit être représentable dans un environnement 64 bits, donc pas vraiment de limite.
il y a une limite pratique, cependant. J'ai un dépôt qui est d'environ 8 Go avec plus de 880 000 et git gc prend un certain temps. L'arbre de travail est assez grand de sorte que les opérations qui inspectent alors tout le répertoire de travail prennent un certain temps. Ce repo est seulement utilisé pour le stockage de données, cependant, il est juste un tas de des outils automatisés qui le manipulent. Tirer des changements de la pension est beaucoup, beaucoup plus rapide que rsyncing les mêmes données.
%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 vous ajoutez des fichiers qui sont trop gros (GBS dans mon cas, Cygwin, XP, 3 Go de RAM), attendez-vous à cela.
fatal: de mémoire, malloc a échoué
plus de détails ici
mise à Jour 3/2/11: Vu de semblable dans Windows 7 x64 avec Tortoise Git. Des tonnes de mémoire utilisée, réponse du système très très lente.
de retour en février 2012, il y avait un fil très intéressant sur la liste de diffusion Git de Joshua Redstone, un ingénieur logiciel de Facebook testing Git sur un énorme dépôt de test:
le test repo a 4 millions d'engagements, l'histoire linéaire et environ 1,3 millions fichier.
Tests ont été exécutés montrer que pour un repo Git est inutilisable (opération froide dure de quelques minutes), mais cela peut changer dans le avenir. Fondamentalement, la performance est pénalisée par le nombre d'appels stat()
vers le module FS du noyau, donc cela dépendra du nombre de fichiers dans le repo, et de L'efficacité de la mise en cache FS. Voir aussi ce Gist pour de plus amples discussions.
cela dépend de ce que vous voulez dire. Il ya des limites de taille pratique (si vous avez beaucoup de gros fichiers, il peut obtenir boringly lente). Si vous avez beaucoup de fichiers, les analyses peuvent également devenir lent.
Il n'y a pas vraiment de limites inhérentes au modèle. Vous pouvez certainement l'utiliser mal et d'être misérable.
je pense qu'il est bon d'essayer d'éviter les grandes propagations de fichiers comme faisant partie du dépôt (par exemple un dump de base de données pourrait être mieux ailleurs), mais si l'on considère la taille du noyau dans son dépôt, vous pouvez probablement vous attendre à travailler confortablement avec quelque chose de plus petit en taille et moins complexe que cela.
j'ai une quantité généreuse de données qui est stockée dans ma déclaration en tant que fragments JSON individuels. Il y a environ 75 000 fichiers sous quelques répertoires et ce n'est pas vraiment préjudiciable à la performance.
les vérifier la première fois a été, évidemment, un peu lent.
j'ai trouvé cela en essayant de stocker un nombre massif de fichiers(350k+) dans un repo. Oui, store. Rire.
$ time git add .
git add . 333.67s user 244.26s system 14% cpu 1:06:48.63 total
les extraits suivants du Bitbucket documentation sont assez intéressants.
lorsque vous travaillez avec un dépôt DVCS cloner, pousser, vous travaillez avec l'ensemble du dépôt et toute son histoire. En pratique, une fois que votre dépôt dépasse 500 Mo, vous pouvez commencer voir les questions.
... 94% des clients Bitbucket ont des dépôts inférieurs à 500 Mo. Le noyau Linux et Android sont tous deux inférieurs à 900 Mo.
la solution recommandée sur cette page est de diviser votre projet en plus petits morceaux.
en date du 2018-04-20 Git for Windows a un bug qui limite effectivement la taille du fichier à 4 Go max en utilisant cette implémentation particulière (ce bug se propage à lfs ainsi ).