Was sind die Dateilimits in Git (Anzahl und Größe)?

174

Weiß jemand, wie hoch die Git-Grenzwerte für die Anzahl der Dateien und die Größe der Dateien sind?

Alexandre Rademaker
quelle

Antworten:

161

Diese Nachricht von Linus selbst kann Ihnen bei einigen anderen Einschränkungen helfen

[...] CVS, dh es orientiert sich tatsächlich ziemlich stark an einem Modell "eine Datei zu einer Zeit".

Das ist insofern schön, als Sie eine Million Dateien haben und dann nur einige davon auschecken können - Sie werden es nie sehen , die Auswirkungen der anderen 999.995 Dateien.

Git betrachtet grundsätzlich nie weniger als das gesamte Repo. Selbst wenn Sie die Dinge ein wenig einschränken (dh nur einen Teil davon überprüfen oder die Geschichte ein wenig zurückgehen lassen), kümmert sich git immer noch um das Ganze und trägt das Wissen mit sich herum.

Git skaliert also wirklich schlecht, wenn Sie es zwingen, alles als ein riesiges Repository zu betrachten. Ich denke nicht, dass dieser Teil wirklich reparierbar ist, obwohl wir ihn wahrscheinlich verbessern können.

Und ja, dann gibt es die "Big File" -Probleme. Ich weiß wirklich nicht, was ich mit riesigen Dateien anfangen soll. Wir saugen an ihnen, ich weiß.

Weitere Informationen finden Sie in meiner anderen Antwort : Die Grenze bei Git besteht darin, dass jedes Repository einen " zusammenhängenden Satz von Dateien " darstellen muss, das "All-System" an sich (Sie können "Teil eines Repositorys" nicht mit Tags versehen).
Wenn Ihr System aus autonomen (aber voneinander abhängigen) Teilen besteht, müssen Sie Submodule verwenden .

Wie durch dargestellt Talljoe Antwort , kann die Grenze sein , System eine (große Anzahl von Dateien), aber wenn man die Natur von Git (über die Datenkohärenz durch seine SHA-1 Tasten dargestellt) zu tun verstehen, werden Sie feststellen , die wahre „limit“ ist eine Verwendung : dh Sie sollten nicht versuchen, alles in einem Git-Repository zu speichern , es sei denn, Sie sind bereit, immer alles zurückzubekommen oder zu markieren. Für einige große Projekte wäre dies nicht sinnvoll.


Weitere Informationen zu den Git-Grenzwerten finden Sie unter " Git mit großen Dateien "
(in dem git-lfs erwähnt wird : eine Lösung zum Speichern großer Dateien außerhalb des Git-Repos. GitHub, April 2015).

Die drei Probleme, die ein Git-Repo einschränken:

  • große Dateien (das xdelta für die Packdatei befindet sich nur im Speicher, was bei großen Dateien nicht gut ist)
  • Eine große Anzahl von Dateien , dh eine Datei pro Blob und Slow Git GC, um jeweils eine Packdatei zu generieren.
  • Riesige Packdateien mit einem ineffizienten Packfile-Index zum Abrufen von Daten aus der (riesigen) Packdatei.

Ein neuerer Thread (Februar 2015) zeigt die einschränkenden Faktoren für ein Git-Repo :

Verlangsamen einige gleichzeitige Klone vom zentralen Server auch andere gleichzeitige Vorgänge für andere Benutzer?

Beim Klonen gibt es keine Sperren im Server, sodass das Klonen theoretisch keine Auswirkungen auf andere Vorgänge hat. Das Klonen kann jedoch viel Speicher verbrauchen (und viel CPU, es sei denn, Sie aktivieren die Bitmap-Funktion für die Erreichbarkeit, die Sie sollten).

Wird ' git pull' langsam sein?

Wenn wir die Serverseite ausschließen, ist die Größe Ihres Baums der Hauptfaktor , aber Ihre 25k-Dateien sollten in Ordnung sein (Linux hat 48k-Dateien).

' git push'?

Dieser wird nicht davon beeinflusst, wie tief die Geschichte Ihres Repos ist oder wie breit Ihr Baum ist, sollte also schnell sein.

Ah, die Anzahl der Refs kann sowohl git-pushals auch beeinflussen git-pull.
Ich denke, Stefan weiß es besser als ich in diesem Bereich.

' git commit'? (Es wird in Referenz 3 als langsam aufgeführt .) ' git status'? (Wieder langsam in Referenz 3, obwohl ich es nicht sehe.)
(Auch git-add)

Wieder die Größe Ihres Baumes. Bei der Größe Ihres Repos müssen Sie sich darüber keine Sorgen machen.

Einige Vorgänge scheinen nicht alltäglich zu sein, aber wenn sie vom Web-Frontend häufig zu GitLab / Stash / GitHub usw. aufgerufen werden, können sie zu Engpässen werden. (zB ' git branch --contains' scheint durch eine große Anzahl von Zweigen furchtbar nachteilig beeinflusst zu werden.)

git-blame kann langsam sein, wenn eine Datei stark verändert wird.

VonC
quelle
4
@ Thr4wn: Weitere Informationen finden Sie auf der GitPro-Submodulseite unter stackoverflow.com/questions/1979167/git-submodule-update/…. Für eine kürzere Version: stackoverflow.com/questions/2065559/…
VonC
1
Aktualisierter Link für die Dokumentation zu Git-Submoulen = git-scm.com/book/en/Git-Tools-Submodules
JHowIX
Ich frage mich wirklich, warum sie bei so viel SQLite und vielen unter Linux verfügbaren Datenbankalternativen nicht einfach eine Datenbank verwenden können, die einfach zu sichern, zu replizieren und zu skalieren ist.
Akash Kava
"Git skaliert wirklich schlecht, wenn Sie es zwingen, alles als ein riesiges Repository zu betrachten" Was sagt dies über die Skalierbarkeit von Monorepos aus?
Ephemer
@ Ephemer Was gesagt wird ist ... dass das Zitat von vor 10 Jahren ist. Seitdem, im Jahr 2017, hat Microsoft eine eigene Monorepo ( devblogs.microsoft.com/bharry/… : 300GB +) und Verbesserungen stehen 2019 noch aus: stackoverflow.com/a/57129687/6309
VonC
36

Es gibt keine wirkliche Begrenzung - alles wird mit einem 160-Bit-Namen benannt. Die Größe der Datei muss in einer 64-Bit-Zahl darstellbar sein, damit es auch dort keine wirkliche Begrenzung gibt.

Es gibt jedoch eine praktische Grenze. Ich habe ein Repository von ~ 8 GB mit> 880.000 Dateien und git gc dauert eine Weile. Der Arbeitsbaum ist ziemlich groß, sodass Vorgänge, die das gesamte Arbeitsverzeichnis überprüfen, eine Weile dauern. Dieses Repo wird jedoch nur zur Datenspeicherung verwendet, sodass nur eine Reihe automatisierter Tools damit umgehen. Das Abrufen von Änderungen aus dem Repo ist viel, viel schneller als das Synchronisieren derselben Daten.

%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    .
Talljoe
quelle
2
Obwohl es oben eine "korrektere" Antwort gibt, die über die theoretischen Einschränkungen spricht, scheint mir diese Antwort hilfreicher zu sein, da sie es ermöglicht, die eigene Situation mit Ihrer zu vergleichen. Vielen Dank.
Bananeweizen
1
Sehr interessant. Wie ist es möglich, dass die Arbeitskopie größer als das .gitVerzeichnis ist? Meine naive Annahme war, dass das .giteine Kopie des Arbeitsverzeichnisses plus des Verlaufs enthält, also muss es größer sein. Kann mich jemand auf eine Ressource hinweisen, die versteht, wie diese Größen zusammenhängen?
bluenote10
1
@ bluenote10 Der Inhalt im .gitVerzeichnis wird komprimiert. Ein Repository mit relativ wenigen Commits hat wahrscheinlich einen kleineren komprimierten Verlauf als das unkomprimierte Arbeitsverzeichnis. Meine Erfahrung zeigt, dass in der Praxis mit C ++ - Code der gesamte Verlauf normalerweise ungefähr so ​​groß ist wie das Arbeitsverzeichnis.
Prapin
28

Wenn Sie zu große Dateien hinzufügen (in meinem Fall GB, Cygwin, XP, 3 GB RAM), erwarten Sie dies.

fatal: Nicht genügend Speicher, Malloc ist fehlgeschlagen

Weitere Details hier

Update 02.03.11: Ähnliches in Windows 7 x64 mit Tortoise Git. Tonnenweise Speicherplatz, sehr, sehr langsame Systemreaktion.

Brian Carlton
quelle
17

Bereits im Februar 2012 gab es einen sehr interessanten Thread auf der Git-Mailingliste von Joshua Redstone, einem Facebook-Softwareentwickler, der Git in einem riesigen Test-Repository testet:

Das Test-Repo hat 4 Millionen Commits, einen linearen Verlauf und ungefähr 1,3 Millionen Dateien.

Durchgeführte Tests zeigen, dass Git für ein solches Repo unbrauchbar ist (Kaltbetrieb dauert Minuten), dies kann sich jedoch in Zukunft ändern. Grundsätzlich wird die Leistung durch die Anzahl der stat()Aufrufe des Kernel-FS-Moduls beeinträchtigt, sodass dies von der Anzahl der Dateien im Repo und der FS-Caching-Effizienz abhängt. Siehe auch diesen Kern für weitere Diskussion.

CharlesB
quelle
2
+1 Interessant. Das spiegelt meine eigenen Antworten zu Git-Limits wider, in denen die Einschränkungen für große Dateien / Anzahl der Dateien / Packdateien aufgeführt sind.
VonC
3

Es hängt davon ab, was Ihre Bedeutung ist. Es gibt praktische Größenbeschränkungen (wenn Sie viele große Dateien haben, kann es langweilig langsam werden). Wenn Sie viele Dateien haben, können Scans auch langsam werden.

Dem Modell sind jedoch keine wirklichen Grenzen gesetzt. Sie können es sicherlich schlecht benutzen und unglücklich sein.

Dustin
quelle
1

Ich denke, es ist gut zu versuchen, große Datei-Commits als Teil des Repositorys zu vermeiden (z. B. könnte ein Datenbank-Dump anderswo besser dran sein), aber wenn man die Größe des Kernels in seinem Repository berücksichtigt, kann man wahrscheinlich erwarten, dass man bequem arbeitet mit etwas kleinerem und weniger komplexem.

Kzqai
quelle
1

Ich habe eine großzügige Datenmenge, die in meinem Repo als einzelne JSON-Fragmente gespeichert ist. Unter einigen Verzeichnissen befinden sich etwa 75.000 Dateien, was die Leistung nicht wirklich beeinträchtigt.

Das erste Mal zu überprüfen war offensichtlich etwas langsam.

funwhilelost
quelle
1

Ich fand dies beim Versuch, eine große Anzahl von Dateien (350k +) in einem Repo zu speichern. Ja, speichern. Lacht.

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

Die folgenden Auszüge aus der Bitbucket- Dokumentation sind sehr interessant.

Wenn Sie mit einem DVCS-Repository arbeiten, das klont und pusht, arbeiten Sie mit dem gesamten Repository und seinem gesamten Verlauf. In der Praxis können Probleme auftreten, sobald Ihr Repository größer als 500 MB wird.

... 94% der Bitbucket-Kunden haben Repositorys mit weniger als 500 MB. Sowohl der Linux-Kernel als auch Android sind unter 900 MB groß.

Die empfohlene Lösung auf dieser Seite besteht darin, Ihr Projekt in kleinere Teile aufzuteilen.

Kasisnu
quelle
Ich denke das ist ziemlich veraltet. Im Moment scheint es auf der Website, auf die Sie verlinken, nichts über Android (oder Linux) Repo zu geben. Aber ich frage mich, ob es damals noch nicht ungenau war? Vergleichen Sie zB diese Antwort . Vielleicht bedeuteten sie etwas anderes?
JJJ