Ich habe ein Repo von 10 GB auf einem Linux-Computer, der auf NFS läuft. Das erste Mal git status
dauert 36 Minuten und das anschließende git status
dauert 8 Minuten. Git hängt anscheinend vom Betriebssystem ab, um Dateien zwischenzuspeichern. Nur die ersten git
Befehle wie commit
, status
dass Pack beinhaltet / umpacken die ganze Repo eine sehr lange Zeit für eine riesige Repo nimmt. Ich bin mir nicht sicher, ob Sie git status
ein so großes Repo verwendet haben, aber ist jemand auf dieses Problem gestoßen?
Ich habe versucht git gc
, git clean
, git repack
aber die Zeit genommen , ist nach wie vor / fast gleich.
Helfen Submodule oder andere Konzepte wie das Aufteilen des Repos in kleinere? Wenn ja, welches ist das beste, um ein größeres Repo aufzuteilen? Gibt es eine andere Möglichkeit, die Zeit für Git-Befehle in einem großen Repo zu verbessern?
quelle
Antworten:
Um genauer zu sein, hängt git von der Effizienz des
lstat(2)
Systemaufrufs ab. Daher kann es hilfreich sein, das "Attribut-Cache-Timeout" Ihres Clients zu optimieren.Das Handbuch für
git-update-index
- im Wesentlichen ein manueller Modus fürgit-status
- beschreibt, wie Sie dies beheben können, indem Sie das--assume-unchanged
Flag verwenden , um das normale Verhalten zu unterdrücken und die von Ihnen geänderten Pfade manuell zu aktualisieren. Sie können Ihren Editor sogar so programmieren, dass dieses Flag bei jedem Speichern einer Datei deaktiviert wird.Die Alternative besteht, wie Sie vorschlagen, darin, die Größe Ihrer Kasse zu reduzieren (die Größe der Packdateien kommt hier nicht wirklich ins Spiel). Die Optionen sind eine spärliche Kaufabwicklung, Submodule oder das Repo- Tool von Google .
(Es gibt einen Mailinglisten- Thread über die Verwendung von Git mit NFS , der jedoch nicht viele Fragen beantwortet.)
quelle
core.preloadindex
auf true aktiviert werden.git-config
Eine ausführlichere Beschreibung finden Sie in den Dokumenten. (Mein Arbeitsplatz verwendet NFS, und ich bin genau auf dieses Problemcore.preloadindex
Flag ist standardmäßig ab Git 2.1.0Ich sehe dieses Problem auch bei einem großen Projekt, das über NFS geteilt wird.
Ich habe einige Zeit gebraucht , um das Flag -uno zu entdecken, das sowohl dem Git-Commit als auch dem Git-Status zugewiesen werden kann.
Mit diesem Flag wird die Suche nach nicht verfolgten Dateien deaktiviert. Dies reduziert die Anzahl der NFS-Operationen erheblich. Der Grund dafür ist, dass git, um nicht verfolgte Dateien zu erkennen, in allen Unterverzeichnissen suchen muss. Wenn Sie also viele Unterverzeichnisse haben, wird dies Ihnen schaden. Indem Sie git daran hindern, nach nicht verfolgten Dateien zu suchen, eliminieren Sie alle diese NFS-Vorgänge.
Wenn Sie dies mit dem Flag core.preloadindex kombinieren, erhalten Sie auch unter NFS eine resonante Leistung.
quelle
status.showUntrackedFiles
Konfiguration als Standard festgelegt werden .Versuchen Sie es mit git gc . Auch Git Clean kann helfen.
UPDATE - Ich bin mir nicht sicher, woher die Abwertung stammt, aber im Git-Handbuch heißt es ausdrücklich:
Ich bemerke immer einen Unterschied, nachdem ich git gc ausgeführt habe, wenn der git-Status langsam ist!
UPDATE II - Ich bin mir nicht sicher, wie ich das verpasst habe, aber das OP hat es bereits versucht
git gc
undgit clean
. Ich schwöre, das war ursprünglich nicht da, aber ich sehe keine Änderungen in den Änderungen. Das tut mir leid!quelle
git gc
Verkürzen Sie die Zeit, umgit log
auf einem meiner Repos von 15 Sekunden auf 0 zu laufen.Wenn Ihr Git-Repo stark von Submodulen Gebrauch macht, können Sie die Leistung des Git-Status erheblich beschleunigen, indem Sie die Konfigurationsdatei im Verzeichnis .git bearbeiten und
ignore = dirty
besonders große / schwere Submodule festlegen. Zum Beispiel:Sie verlieren die Bequemlichkeit einer Erinnerung daran, dass in einem der Submodule, die Sie möglicherweise vergessen haben, nicht bereitgestellte Änderungen vorgenommen wurden, behalten jedoch den Hauptkomfort bei, zu wissen, wann die Submodule nicht mit dem Haupt-Repo synchron sind. Außerdem können Sie Ihr Arbeitsverzeichnis weiterhin in das Submodul selbst ändern und den Git-Status wie gewohnt verwenden, um weitere Informationen anzuzeigen. In dieser Frage erfahren Sie mehr darüber, was "schmutzig" bedeutet.
quelle
Die Leistung des Git-Status sollte sich mit Git 2.13 (Q2 2017) verbessern.
Siehe Commit 950a234 (14. April 2017) von Jeff Hostetler (
jeffhostetler
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 8b6bba6 , 24. April 2017)>
string-list
: Verwenden Sie bei der Neuzuweisung einALLOC_GROW
Makrostring_list
Außerdem wird Git 2.17 (Q2 2018) eine neue Ablaufverfolgung einführen, mit der gemessen werden kann, wo die Zeit für indexintensive Operationen aufgewendet wird.
Siehe Commit ca54d9b (27. Januar 2018) von Nguyễn Thái Ngọc Duy (
pclouds
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 090dbea , 15. Februar 2018)Das gleiche Git 2.17 (Q2 2018) verbessert sich
git status
mit:Commit f39a757 , Commit 3ca1897 , Commit fd9b544 , Commit d7d1b49 (09. Januar 2018) von Jeff Hostetler (
jeffhostetler
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 4094e47 , 08. März 2018)"
git status
" kann viele Zyklen zur Berechnung der Beziehung zwischen dem aktuellen Zweig und seinem Upstream verwenden, die jetzt mit der--no-ahead-behind
Option " " deaktiviert werden kann .begehen ebbed3b (25. Februar 2018) von Derrick Stolee (
derrickstolee
) .Git 2.24 (Q3 2019) schlägt eine andere Einstellung vor, um die
git status
Leistung zu verbessern :Siehe Commit aaf633c , Commit c6cc4c5 , Commit ad0fb65 , Commit 31b1de6 , Commit b068d9a , Commit 7211b9e (13. August 2019) von Derrick Stolee (
derrickstolee
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit f4f8dfe , 9. September 2019)Aber:
Mit Git 2.24 (Q4 2019) wurde der Codepfad, der die
index.version
Konfiguration liest, durch ein kürzlich korrigiertes Update unterbrochen.Siehe Commit c11e996 (23. Oktober 2019) von Derrick Stolee (
derrickstolee
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 4d6fb2b , 24. Oktober 2019)quelle
index.threads
Konfigurationseinstellunggit config --global core.preloadIndex true
Hat den Job für mich gemacht. Überprüfen Sie die offizielle Dokumentation hier .
quelle
2.7.4
. Ich benutze Linux Subsystem für Windows und selbst aktualisiertapt-get
scheint Verweise auf ziemlich alte Pakete zu haben.In unserer Codebasis, in der wir irgendwo im Bereich von 20 bis 30 Submodulen haben, haben sich
git status --ignore-submodules
die Dinge für mich drastisch beschleunigt. Beachten Sie, dass dies nicht über den Status von Submodulen berichtet .
quelle
Was noch nicht erwähnt wurde, ist, den Dateisystem-Cache auf Windows-Computern zu aktivieren (Linux-Dateisysteme sind völlig anders und Git wurde für sie optimiert, daher hilft dies wahrscheinlich nur unter Windows).
Als letztes Mittel, wenn Git immer noch langsam ist, könnte man die Überprüfung der Änderungszeit deaktivieren, damit Git herausfinden kann, welche Dateien sich geändert haben.
ABER: Geänderte Dateien müssen anschließend vom Entwickler selbst mit hinzugefügt werden
git add
. Git findet selbst keine Änderungen.Quelle
quelle
Übrig gebliebene
index.lock
Dateiengit status
kann pathologisch langsam sein, wenn Sie übrig gebliebeneindex.lock
Dateien haben.Dies geschieht insbesondere dann, wenn Sie
git submodules
solche Lefterover-Dateien häufig nicht bemerken.Zusammenfassung: Führen Sie
find .git/ -name index.lock
die verbleibenden Dateien aus und löschen Sie sie, nachdem Sie überprüft haben, ob sie tatsächlich von keinem aktuell ausgeführten Programm verwendet werden.Einzelheiten
Ich fand, dass mein Shell-Git-Status in meinem Repo extrem langsam war, mit Git 2.19 unter Ubuntu 16.04.
Eingegraben und festgestellt, dass
/usr/bin/time git status
in meinemassets
Git-Submodul 1,7 Sekunden dauerte.Gefunden mit
strace
diesem Git lesen alle meine großen Dateien dort mitmmap
. Das macht es normalerweise nicht, normalerweisestat
ist es genug.Ich habe das Problem gegoogelt und das Problem mit der Verwendung von Index und Racy Git gefunden .
Versucht
git update-index somefile
(in meinem Fallgitignore
in der Submodul-Kasse) hier gezeigt , aber es ist fehlgeschlagen mitDies ist ein klassischer Fehler. Normalerweise bemerken Sie es bei jeder Git-Operation, aber bei Submodulen, auf die Sie sich nicht oft festlegen, bemerken Sie es möglicherweise monatelang nicht, da es nur angezeigt wird, wenn Sie dem Index etwas hinzufügen. Die Warnung wird nicht schreibgeschützt ausgelöst
git status
.Das Entfernen der
index.lock
Dateigit status
wurde sofort schnell,mmaps
verschwand und ist jetzt über 1000x schneller.Wenn Ihr Git-Status unnatürlich langsam ist, überprüfen
find .git/ -name index.lock
und löschen Sie die Reste.quelle
Es ist eine ziemlich alte Frage. Ich bin jedoch überrascht, dass sich angesichts der Repository-Größe niemand zu einer Binärdatei geäußert hat.
Sie haben erwähnt, dass Ihr Git-Repo ~ 10 GB beträgt. Abgesehen von NFS-Problemen und anderen Git-Problemen (behebbar durch
git gc
und Änderung der Git-Konfiguration als Umriss in anderen Antworten) scheinen Git-Befehle (Git-Status, Git-Diff, Git-Add) aufgrund der großen Anzahl von Binärdateien im Repository langsam zu sein . Git ist nicht gut im Umgang mit Binärdateien. Sie können unnötige Binärdateien mit dem folgenden Befehl entfernen (Beispiel für NetCDF-Datei; Sicherung des Git-Repositorys vorher):git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch *.nc' \ --prune-empty --tag-name-filter cat -- --all
Vergessen Sie nicht, '* .nc' in die gitignore-Datei einzufügen, um zu verhindern, dass git die Datei erneut festlegt.
quelle