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 ein ALLOC_GROW
Makrostring_list
Verwenden Sie ALLOC_GROW()
Makro, wenn Sie ein string_list
Array neu zuweisen, anstatt es einfach um 32 zu erhöhen.
Dies ist eine Leistungsoptimierung.
Während des Status eines sehr großen Repos und vieler Änderungen wird ein erheblicher Prozentsatz der Gesamtlaufzeit für die Neuzuweisung des wt_status.changes
Arrays aufgewendet .
Diese Änderung verringert die Zeit in wt_status_collect_changes_worktree()
meinem sehr großen Repository von 125 Sekunden auf 45 Sekunden.
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)
trace
: Messen Sie, wo die Zeit in den indexlastigen Operationen verbracht wird
Alle bekannten schweren Codeblöcke werden gemessen (außer Objektdatenbankzugriff). Dies sollte helfen, festzustellen, ob eine Optimierung effektiv ist oder nicht.
Ein nicht optimierter Git-Status würde ungefähr Folgendes ergeben:
0.001791141 s: read cache ...
0.004011363 s: preload index
0.000516161 s: refresh index
0.003139257 s: git command: ... 'status' '--porcelain=2'
0.006788129 s: diff-files
0.002090267 s: diff-index
0.001885735 s: initialize name hash
0.032013138 s: read directory
0.051781209 s: git command: './git' 'status'
Das gleiche Git 2.17 (Q2 2018) verbessert sich git status
mit:
revision.c
: Objektdatenbankabfragen reduzieren
In mark_parents_uninteresting()
überprüfen wir, ob eine Objektdatei vorhanden ist, um festzustellen, ob ein Commit als analysiert behandelt werden soll. Das Ergebnis ist das Setzen des "analysierten" Bits beim Festschreiben.
Ändern Sie die Bedingung, um nur zu überprüfen, has_object_file()
ob das Ergebnis das analysierte Bit ändern würde.
Wenn sich eine lokale Niederlassung von ihrer vorgelagerten Referenz unterscheidet, git status
berechnet " " Voraus- / Rückwärtszählungen.
Dies verwendet paint_down_to_common()
und trifft mark_parents_uninteresting()
.
Bei einer Kopie des Linux-Repos mit einer lokalen Instanz von "master" hinter dem Remote-Zweig " origin/master
" um ~ 60.000 Commits wurde die Leistung von " git status
" von 1,42 Sekunden auf 1,32 Sekunden erhöht, was einer relativen Differenz von -7,0% entspricht.
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)
Repo-Einstellungen: Erstellen Sie die Einstellung feature.manyFiles
Die feature.manyFiles
Einstellung eignet sich für Repos mit vielen Dateien im Arbeitsverzeichnis.
Durch Setzen von index.version=4
und core.untrackedCache=true
sollten Befehle wie ' git status
' verbessert werden.
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)
repo-settings
: Lesen Sie ein Int für index.version
Unterzeichnet von: Derrick Stolee
Mehrere Konfigurationsoptionen wurden repo_settings
in ds / feature-macros zu einer Struktur kombiniert , einschließlich einer Verschiebung der Konfigurationseinstellung "index.version" in 7211b9e (" repo-settings
: Einige Konfigurationseinstellungen konsolidieren", 2019-08-13, Git v2.24.0-rc1 - Zusammenführung in Charge Nr. 0 ).
Leider sah diese Datei wie eine Menge Boilerplate aus und was eindeutig ein Faktor für die Überladung durch Kopieren und Einfügen ist, ist, dass die Konfigurationseinstellung repo_config_ge_bool()
anstelle von analysiert wird repo_config_get_int()
. Dies bedeutet, dass eine Einstellung "index.version = 4" nicht korrekt registriert und auf die Standardversion von 3 zurückgesetzt wird.
Ich habe dies festgestellt, als ich v2.24.0-rc0 in die VFS for Git-Codebasis integriert habe, wobei es uns wirklich wichtig ist, dass der Index in Version 4 enthalten ist.
Dies wurde von der Codebasis nicht erfasst, da die eingegebenen Versionsprüfungen t1600-index.sh
das "grundlegende" Szenario nicht ausreichend testeten. Hier ändern wir den Test so, dass diese normalen Einstellungen nicht von features.manyFiles
oder überschrieben werden GIT_INDEX_VERSION
.
Während die "Standard" -Version 3 ist, wird diese in Version 2 herabgestuft, do_write_index()
wenn dies nicht erforderlich ist.