web-dev-qa-db-fra.com

Quelles sont les limites de fichiers dans Git (nombre et taille)?

Est-ce que quelqu'un sait quelles sont les limites Git pour le nombre de fichiers et leur taille?

166

Ce message de Linus lui-même peut vous aider avec d’autres limites

[...] CVS, c’est-à-dire qu’il finit par s’orienter plutôt vers un modèle «un fichier .__ à la fois».

Ce qui est bien en ce sens que vous pouvez avoir un million de fichiers, et ensuite seulement vérifier quelques-uns d'entre eux - vous ne serez jamais même voir l'impact de l'autre 999 995 fichiers.

Git fondamentalement jamais vraiment regarde à moins que le repo entier. Même si vous limitez un peu les choses (c’est-à-dire qu’il n’en reste qu’une portion ou que l’historique est complet. un peu en arrière), git finit toujours par se préoccuper de l’ensemble, et portant la connaissance autour.

Donc, git balance vraiment mal si vous le forcez à tout regarder comme un _ {énorme} _ référentiel. Je ne pense pas que cette partie soit vraiment réparable, bien que nous peut probablement l'améliorer.

Et oui, alors il y a les problèmes de "gros fichier". Je ne sais vraiment pas quoi faire faire des fichiers énormes. On les aspire, je sais. 

Voir plus dans ma autre réponse : la limite avec Git est que chaque référentiel doit représenter un " ensemble cohérent de fichiers ", le "tout système" en lui-même (vous ne pouvez pas baliser la partie d'un référentiel ").
Si votre système est constitué de parties autonomes (mais interdépendantes), vous devez utiliser sous-modules.

Comme illustré par la réponse de Talljoe , la limite peut être un système (grand nombre de fichiers), mais si vous comprenez la nature de Git (à propos de la cohérence des données représentée par ses clés SHA-1 ), vous réaliserez que la vraie "limite" est une utilisation une: vous ne devez pas essayer de stocker tout dans un référentiel Git, à moins que vous ne soyez prêt à toujours obtenir ou marquer tout retour. Pour certains grands projets, cela n'aurait aucun sens.


Pour plus de détails sur les limites de git, voir " git avec des fichiers volumineux "
(qui mentionne git-lfs: une solution pour stocker des fichiers volumineux en dehors du référentiel git. GitHub, avril 2015)

Les trois problèmes qui limitent un repo git:

  • gigantesques fichiers (le xdelta pour packfile est uniquement en mémoire, ce qui n'est pas bien avec les gros fichiers)
  • nombre énorme de fichiers, ce qui signifie un fichier par blob, et ralentir git gc pour générer un fichier de type à la fois.
  • huge packfiles, avec un index packfile inefficace pour récupérer les données du (énorme) packfile.

Un fil de discussion plus récent (février 2015) illustre les facteurs limitants d'un dépôt Git :

Quelques clones simultanés du serveur central ralentiront-ils également d'autres opérations simultanées pour d'autres utilisateurs?

Il n'y a pas de verrous sur le serveur lors du clonage. En principe, le clonage n'affecte donc pas les autres opérations. Le clonage peut cependant utiliser beaucoup de mémoire (et beaucoup de CPU, sauf si vous activez la fonctionnalité bitmap d'accessibilité, ce que vous devriez faire).

Est-ce que 'git pull' sera lent?

Si nous excluons le côté serveur, la taille de votre arborescence est le facteur principal, mais vos fichiers de 25k devraient être corrects (Linux a des fichiers de 48k).

'git Push'?

Celui-ci n'est pas affecté par la profondeur de l'historique de votre repo, ni par la largeur de votre arbre, il devrait donc être rapide.

Ah, le nombre de références peut affecter à la fois git-Push et git-pull.
Je pense que Stefan sait mieux que moi dans ce domaine.

'git commit'? (Il est répertorié comme lent dans référence 3.) 'git status'? (Ralentissez encore dans la référence 3 si je ne le vois pas.)
(aussi git-add)

Encore une fois, la taille de votre arbre. À la taille de votre dépôt, je ne pense pas que vous ayez à vous en soucier.

Certaines opérations peuvent ne pas sembler être quotidiennes, mais si elles sont appelées fréquemment par l'interface Web de GitLab/Stash/GitHub, etc., elles 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 beaucoup modifié.

153
VonC

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 nombre de 64 bits, donc aucune limite réelle non plus.

Il y a cependant une limite pratique. J'ai un référentiel qui fait ~ 8 Go avec> 880 000 et git gc prend un certain temps. L'arbre de travail est plutôt volumineux, de sorte que les opérations qui inspectent ensuite tout le répertoire de travail prennent un certain temps. Ce référentiel n’est utilisé que pour le stockage de données, c’est donc un ensemble d’outils automatisés qui le gère. Extraire les modifications du référentiel est beaucoup, beaucoup plus rapide que de synchroniser 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    .
32
Talljoe

Si vous ajoutez des fichiers trop volumineux (Go dans mon cas, Cygwin, XP, 3 Go de RAM), attendez-vous à cela.

fatal: manque de mémoire, échec de malloc

Plus de détails ici

Mise à jour 3/2/11: Scie similaire dans Windows 7 x64 avec Tortoise Git. Des tonnes de mémoire utilisées, réponse du système très très lente.

28
Brian Carlton

En février 2012, il y avait un sujet très intéressant sur la liste de diffusion Git de Joshua Redstone, un ingénieur logiciel Facebook testant Git sur un énorme référentiel de tests: 

Le référentiel test compte 4 millions d’engagements, un historique linéaire et environ 1,3 million des dossiers.

Les tests qui ont été effectués montrent que Git est inutilisable pour un tel repo (opération à froid ne prenant que quelques minutes), mais cela pourrait changer dans le futur. Fondamentalement, les performances sont pénalisées par le nombre d'appels stat() au module FS du noyau. Elles dépendent donc du nombre de fichiers du référentiel et de l'efficacité de la mise en cache FS. Voir aussi this Gist pour une discussion plus approfondie.

17
CharlesB

Cela dépend de votre signification. Il existe des limites pratiques de taille (si vous avez beaucoup de gros fichiers, cela peut devenir ennuyeux). Si vous avez beaucoup de fichiers, les analyses peuvent également devenir lentes.

Il n'y a pas vraiment de limites inhérentes au modèle, cependant. Vous pouvez certainement l'utiliser mal et être misérable.

3
Dustin

J'ai une quantité généreuse de données stockées dans mon dépôt sous forme de fragments JSON individuels. Il existe environ 75 000 fichiers dans quelques répertoires, ce qui ne nuit pas vraiment aux performances. 

Les vérifier dans la première fois était, évidemment, un peu lent.

1
funwhilelost

J'ai trouvé cela en essayant de stocker un nombre énorme de fichiers (350k +) dans un repo. Oui, magasin. Des rires. 

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

Les extraits suivants de Bitbucket documentation sont très intéressants.

Lorsque vous travaillez avec un clonage de référentiel DVCS, vous utilisez le référentiel entier et tout son historique. En pratique, une fois que votre référentiel dépasse 500 Mo, vous risquez de rencontrer des problèmes.

... 94% des clients Bitbucket ont des référentiels de moins de 500 Mo. Le noyau Linux et Android ont une capacité inférieure à 900 Mo.

La solution recommandée sur cette page consiste à diviser votre projet en fragments plus petits.

1
Kasisnu

Je pense qu’il est bon d’essayer d’éviter les commits de fichiers volumineux dans le référentiel (par exemple, un dump de base de données pourrait être préférable ailleurs), mais si l’on considère la taille du noyau dans son référentiel, vous pouvez probablement vous attendre à travailler confortablement. avec quelque chose de plus petit en taille et moins complexe que cela.

1
Kzqai

Depuis 2018-04-20 Git pour Windows a un bogue qui limite effectivement la taille du fichier à 4 Go maximum avec cette implémentation particulière (ce bogue se propage également vers lfs ).

0
Kim Sullivan