Git 2.22 (Q2 2019) stellt trace2
mit Commit ee4512e von Jeff Hostetler vor :
trace2
: Neue kombinierte Trace-Funktion erstellen
Erstellen Sie eine neue einheitliche Ablaufverfolgungsfunktion für Git.
Die letztendliche Absicht besteht darin, den Strom trace_printf*
und die trace_performance*
Routinen durch einen einheitlichen Satz von git_trace2*
Routinen zu ersetzen .
trace2
Bietet zusätzlich zur üblichen API im printf-Stil Ereignisverben auf höherer Ebene mit festen Feldern, mit denen strukturierte Daten geschrieben werden können.
Dies erleichtert die Nachbearbeitung und Analyse für externe Tools.
Trace2 definiert 3 Ausgabeziele.
Diese werden mit den Umgebungsvariablen " GIT_TR2
", " GIT_TR2_PERF
" und " GIT_TR2_EVENT
" festgelegt.
Diese können auf "1" oder auf einen absoluten Pfadnamen gesetzt werden (genau wie der aktuelle GIT_TRACE
).
Hinweis: In Bezug auf den Namen der Umgebungsvariablen immer verwenden GIT_TRACExxx
, nicht GIT_TRxxx
.
Also eigentlich GIT_TRACE2
, GIT_TRACE2_PERF
oder GIT_TRACE2_EVENT
.
Siehe die unten erwähnte Umbenennung von Git 2.22.
Was folgt, ist die erste Arbeit an dieser neuen Ablaufverfolgungsfunktion mit den alten Namen der Umgebungsvariablen:
GIT_TR2
soll die GIT_TRACE
Befehlszusammenfassungsdaten ersetzen und protokollieren.
GIT_TR2_PERF
ist als Ersatz für gedacht GIT_TRACE_PERFORMANCE
.
Es erweitert die Ausgabe um Spalten für den Befehlsprozess, Thread, Repo, absolute und relative verstrichene Zeiten. Es werden Ereignisse für das Starten / Stoppen des untergeordneten Prozesses, das Starten / Stoppen des Threads und die Verschachtelung der Funktionen pro Thread gemeldet.
GIT_TR2_EVENT
ist ein neues strukturiertes Format. Es schreibt Ereignisdaten als eine Reihe von JSON-Datensätzen.
Aufrufe von trace2-Funktionen protokollieren bei einem der 3 aktivierten Ausgabeziele, ohne dass andere trace_printf*
oder trace_performance*
Routinen aufgerufen werden müssen .
Siehe Commit a4d3a28 (21. März 2019) von Josh Steadmon ( steadmon
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 1b40314 , 08. Mai 2019)
trace2
: In Verzeichnisziele schreiben
Wenn der Wert einer Umgebungsvariablen trace2 ein absoluter Pfad ist, der auf ein vorhandenes Verzeichnis verweist, schreiben Sie die Ausgabe in Dateien (eine pro Prozess) unter dem angegebenen Verzeichnis.
Dateien werden nach der letzten Komponente der SID trace2 benannt, gefolgt von einem Zähler, um mögliche Kollisionen zu vermeiden.
Dies macht es bequemer, Traces für jeden Git-Aufruf zu sammeln, indem die relevante trace2
Umgebung unbedingt auf einen konstanten Verzeichnisnamen gesetzt wird.
Siehe auch Commit f672dee (29. April 2019) und Commit 81567ca , Commit 08881b9 , Commit bad229a , Commit 26c6f25 , Commit bce9db6 , Commit 800a7f9 , Commit a7bc01e , Commit 39f4317 , Commit a089724 , Commit 1703751 (15. April 2019) von Jeff Hostetler ( jeffhostetler
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 5b2d1c0 , 13. Mai 2019)
Die neue Dokumentation enthält jetzt Konfigurationseinstellungen, die nur aus den System- und globalen Konfigurationsdateien gelesen werden (dh lokale Repository- und Worktree-Konfigurationsdateien sowie -c
Befehlszeilenargumente werden nicht berücksichtigt ).
Beispiel :
$ git config --global trace2.normalTarget ~/log.normal
$ git version
git version 2.20.1.155.g426c96fcdb
ergibt
$ cat ~/log.normal
12:28:42.620009 common-main.c:38 version 2.20.1.155.g426c96fcdb
12:28:42.620989 common-main.c:39 start git version
12:28:42.621101 git.c:432 cmd_name version (version)
12:28:42.621215 git.c:662 exit elapsed:0.001227 code:0
12:28:42.621250 trace2/tr2_tgt_normal.c:124 atexit elapsed:0.001265 code:0
Und zur Leistungsmessung :
$ git config --global trace2.perfTarget ~/log.perf
$ git version
git version 2.20.1.155.g426c96fcdb
ergibt
$ cat ~/log.perf
12:28:42.620675 common-main.c:38 | d0 | main | version | | | | | 2.20.1.155.g426c96fcdb
12:28:42.621001 common-main.c:39 | d0 | main | start | | 0.001173 | | | git version
12:28:42.621111 git.c:432 | d0 | main | cmd_name | | | | | version (version)
12:28:42.621225 git.c:662 | d0 | main | exit | | 0.001227 | | | code:0
12:28:42.621259 trace2/tr2_tgt_perf.c:211 | d0 | main | atexit | | 0.001265 | | | code:0
Wie in Git 2.23 (Q3 2019) dokumentiert, ist die zu verwendende Umgebungsvariable GIT_TRACE2
.
Siehe Commit 6114a40 (26. Juni 2019) von Carlo Marcelo Arenas Belón ( carenas
) .
Siehe Commit 3efa1c6 (12. Juni 2019) von Ævar Arnfjörð Bjarmason ( avar
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit e9eaaa4 , 09. Juli 2019)
Dies folgt der Arbeit in Git 2.22: Commit 4e0d3aa , Commit e4b75d6 (19. Mai 2019) von SZEDER Gábor ( szeder
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 463dca6 , 30. Mai 2019)
trace2
: Umbenennen von Umgebungsvariablen in GIT_TRACE2 *
Für eine Umgebungsvariable, die von Benutzern festgelegt werden soll, sind die Umgebungsvariablen GIT_TR2*
einfach zu unklar, inkonsistent und hässlich.
Die meisten der etablierten GIT_*
Umgebungsvariablen verwenden keine Abkürzungen, und bei den wenigen, die ( ,, ) tun GIT_DIR
, GIT_COMMON_DIR
ist GIT_DIFF_OPTS
es ziemlich offensichtlich, wofür die Abkürzungen ( DIR
und OPTS
) stehen.
Aber wofür steht TR
? Verfolgen, traditionell, Anhänger, Transaktion, Übertragung, Transformation, Übergang, Übersetzung, Transplantation, Transport, Durchquerung, Baum, Auslöser, Abschneiden, Vertrauen oder ...?!
Die trace2-Funktion soll, wie das Suffix '2' im Namen andeutet, die ursprüngliche Trace-Funktion von Git ersetzen.
Es ist zu erwarten, dass die entsprechenden Umgebungsvariablen dem Beispiel folgen und nach den ursprünglichen GIT_TRACE
Variablen aufgerufen werden GIT_TRACE2
. Es gibt kein solches GIT_TR
.
Alle trace2-spezifischen Konfigurationsvariablen befinden sich sehr vernünftigerweise im trace2
Abschnitt ' ', nicht in ' tr2
'.
OTOH, wir gewinnen überhaupt nichts, wenn wir die letzten drei Zeichen von "trace" aus den Namen dieser Umgebungsvariablen weglassen .
Benennen wir also alle GIT_TR2*
Umgebungsvariablen in um GIT_TRACE2*
, bevor sie in eine stabile Version gelangen.
Git 2.24 (Q3 2019) verbessert die Initialisierung des Git-Repositorys.
Siehe Commit 22932d9 , Commit 5732f2b , Commit 58ebccb (06. August 2019) von Jeff King ( peff
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit b4a1eec , 9. September 2019)
common-main: Initialisierung von Trace2 verzögern
Wir initialisieren das trace2
System in der gemeinsamen Funktion main (), damit alle Programme (auch solche, die nicht eingebaut sind) die Ablaufverfolgung ermöglichen.
Der trace2
Start ist jedoch relativ schwer, da wir die Konfiguration auf der Festplatte lesen müssen, um zu entscheiden, ob eine Ablaufverfolgung durchgeführt werden soll.
Dies kann zu unerwarteten Interaktionen mit anderen Common-Main-Initialisierungen führen. Zum Beispiel werden wir vor dem Aufruf im Konfigurationscode landen initialize_the_repository()
, und die übliche Invariante, the_repository
die niemals NULL ist, wird nicht gelten.
Lassen Sie uns die trace2
Initialisierung in Common-Main bis kurz vor der Ausführung weiter nach unten verschieben cmd_main()
.
Git 2.24 (Q4 2019) stellt außerdem sicher, dass die Ausgabe vom trace2
Subsystem jetzt hübscher formatiert wird.
Siehe Commit 742ed63 , Commit e344305 , Commit c2b890a (09. August 2019), Commit ad43e37 , Commit 04f10d3 , Commit da4589c (08. August 2019) und Commit 371df1b (31. Juli 2019) von Jeff Hostetler ( jeffhostetler
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 93fc876 , 30. September 2019)
Und immer noch Git 2.24
Siehe Commit 87db61a , Commit 83e57b0 (04. Oktober 2019) und Commit 2254101 , Commit 3d4548e (03. Oktober 2019) von Josh Steadmon ( steadmon
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit d0ce4d9 , 15. Oktober 2019)
trace2
: Neue Traces verwerfen, wenn das Zielverzeichnis zu viele Dateien enthält
Unterzeichnet von: Josh Steadmon
trace2
kann Dateien in ein Zielverzeichnis schreiben.
Bei starker Nutzung kann sich dieses Verzeichnis mit Dateien füllen, was für Trace-Verarbeitungssysteme zu Schwierigkeiten führt.
Dieser Patch fügt eine Konfigurationsoption ( trace2.maxFiles
) hinzu, um eine maximale Anzahl von Dateien trace2
festzulegen, die in ein Zielverzeichnis geschrieben werden.
Das folgende Verhalten ist aktiviert, wenn maxFiles
auf eine positive Ganzzahl gesetzt ist:
Wenn Sie trace2
eine Datei in ein Zielverzeichnis schreiben möchten, prüfen Sie zunächst, ob die Traces verworfen werden sollen. Spuren sollten verworfen werden, wenn:
- Es gibt eine Sentinel-Datei, die angibt, dass zu viele Dateien vorhanden sind
- ODER, die Anzahl der Dateien überschreitet
trace2.maxFiles
.
Im letzteren Fall erstellen wir eine Sentinel-Datei mit dem Namen git-trace2-discard
, um zukünftige Überprüfungen zu beschleunigen.
Es wird davon ausgegangen, dass ein separates Trace-Verarbeitungssystem die generierten Traces verarbeitet. Sobald die Sentinel-Datei verarbeitet und entfernt wurde, sollte es sicher sein, erneut neue Trace-Dateien zu generieren.
Der Standardwert für trace2.maxFiles
ist Null, wodurch die Überprüfung der Dateizahl deaktiviert wird.
Die Konfiguration kann auch mit einer neuen Umgebungsvariablen überschrieben werden : GIT_TRACE2_MAX_FILES
.
Und Git 2.24 (Q4 2019) lehrt trace2 über git push
Stufen.
Siehe Commit 25e4b80 , Commit 5fc3118 (02. Oktober 2019) von Josh Steadmon ( steadmon
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 3b9ec27 , 15. Oktober 2019)
push
: Trace2-Instrumentierung hinzufügen
Unterzeichnet von: Josh Steadmon
Fügen Sie trace2-Regionen in transport.c
und hinzu builtin/push.c
, um die in verschiedenen Phasen des Pushings verbrachte Zeit besser zu verfolgen:
- Auflistung refs
- Submodule prüfen
- Submodule schieben
- Refs drücken
Mit Git 2.25 (Q1 2020) wird ein Teil davon Documentation/technical
in Header- *.h
Dateien verschoben .
Sehen Sie verpflichten 6c51cb5 , begehen d95a77d , begehen bbcfa30 , begehen f1ecbe0 , begehen 4c4066d , begehen 7db0305 , begehen f3b9055 , begehen 971b1f2 , begehen 13aa9c8 , begehen c0be43f , begehen 19ef3dd , begehen 301d595 , begehen 3a1b341 , begehen 126c1cc , begehen d27eb35 , begehen 405c6b1 , verpflichten d3d7172 , Commit 3f1480b , Commit 266f03e , 266f03e festschreiben(17. November 2019) von Heba Waly ( HebaWaly
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 26c816a , 16. Dezember 2019)
trace2
: Verschieben Sie das Dokument nach trace2.h
Unterzeichnet von: Heba Waly
Verschieben Sie die Funktionsdokumentation von Documentation/technical/api-trace2.txt
nach, trace2.h
da die Entwickler die Verwendungsinformationen neben dem Code leichter finden können, als sie in einer anderen Dokumentdatei zu suchen.
Es wird nur der Abschnitt mit der Funktionsdokumentation entfernt, Documentation/technical/api-trace2.txt
da die Datei viele Details enthält, die für eine separate Dokumentdatei angemessener erscheinen. Ein Link zur Dokumentdatei wird in trace2.h hinzugefügt. Außerdem wird das Funktionsdokument entfernt, um Redundandt-Informationen zu vermeiden, die nur schwer mit der Dokumentation in der Header-Datei synchronisiert werden können.
(obwohl diese Reorganisation einen Nebeneffekt auf einen anderen Befehl hatte, erklärt und behoben mit Git 2.25.2 (März 2020) in Commit cc4f2eb (14. Februar 2020) von Jeff King ( peff
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 1235384 , 17. Februar 2020) )
Mit Git 2.27 (Q2 2020): Trace2-Erweiterung, um die Protokollierung der Umgebungsvariablen zu ermöglichen .
Siehe Commit 3d3adaa (20. März 2020) von Josh Steadmon ( steadmon
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 810dc64 , 22. April 2020)
trace2
: Git lehren, Umgebungsvariablen zu protokollieren
Abgemeldet von: Josh Steadmon
Bestätigt von: Jeff Hostetler
Über trace2 kann Git bereits interessante Konfigurationsparameter protokollieren (siehe trace2_cmd_list_config()
Funktion). Dies kann jedoch zu einem unvollständigen Bild führen, da viele Konfigurationsparameter auch Überschreibungen über Umgebungsvariablen zulassen.
Um vollständigere Protokolle zu ermöglichen, fügen wir eine neue trace2_cmd_list_env_vars()
Funktion und unterstützende Implementierung hinzu, die der bereits vorhandenen Implementierung der Konfigurationsparameterprotokollierung nachempfunden ist.
Lehren Sie mit Git 2.27 (Q2 2020) Codepfade, die die Fortschrittsanzeige anzeigen, um auch die start_progress()
und die stop_progress()
Aufrufe als " region
" zu verfolgen .
Siehe Commit 98a1364 (12. Mai 2020) von Emily Shaffer ( nasamuffin
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit D98abce , 14. Mai 2020)
trace2
: Protokollieren Sie die Fortschrittszeit und den Durchsatz
Abgemeldet von: Emily Shaffer
Anstatt nur eine Operation wie ' git fetch
' zu lehren , wie man den Durchsatz in Traces aufschreibt, können wir uns über eine Vielzahl von Benutzeroperationen informieren, die langsam erscheinen können, indem wir der Fortschrittsbibliothek selbst Werkzeuge hinzufügen .
Vorgänge, die den Fortschritt anzeigen, sind wahrscheinlich langsam und die Art von Dingen, die wir sowieso auf Leistung überwachen möchten.
Durch die Anzeige der Objektanzahl und der Datenübertragungsgröße sollten wir in der Lage sein, einige abgeleitete Messungen durchzuführen, um sicherzustellen, dass die Vorgänge so skalieren, wie wir es erwarten.
Und:
Mit Git 2.27 (Q2 2020) wurde in letzter Minute eine Korrektur für unsere jüngste Änderung vorgenommen, um die Verwendung der Fortschritts-API als nachverfolgbare Region zu ermöglichen.
Siehe Commit 3af029c (15. Mai 2020) von Derrick Stolee ( derrickstolee
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 85d6e28 , 20. Mai 2020)
progress
: trace2_region_leave()
erst nach dem anruf anrufen_enter()
Unterzeichnet von: Derrick Stolee
Ein Benutzer der Fortschritts-API ruft start_progress()
bedingt auf und hängt von den Funktionen display_progress()
und ab stop_progress()
, um No-Op zu werden, wenn start_progress()
sie nicht aufgerufen wurden.
Da wir einen Anruf hinzugefügt , trace2_region_enter()
um start_progress()
die Anrufe zu anderen trace2 API - Aufrufe von den Fortschritt - API - Funktionen müssen sicherstellen, dass diese trace2 Anrufe übersprungen werden , wenn start_progress()
wurde über die Fortschritte Struktur nicht genannt worden.
Rufen Sie insbesondere nicht trace2_region_leave()
an, stop_progress()
wenn wir nicht angerufen haben start_progress()
, was den Abgleich aufgerufen hätte trace2_region_enter()
.
GIT_CURL_VERBOSE
haben Sie mit Git 2.9.x / 2.10GIT_TRACE_CURL
. Siehe meine Antwort unten .