Die Veröffentlichung des verteilten Systems zur Verwaltung von Quelltexten Git 2.31 ist jetzt verfügbar. Git ist eines der beliebtesten, zuverlässigsten und leistungsstärksten Versionsverwaltungssysteme, das flexible Mittel für die nichtlineare Entwicklung bietet, die auf Branching und Merging basiert. Um die Integrität der Historie und die Widerstandsfähigkeit gegen rückblickende Änderungen sicherzustellen, wird das implizite Hashing der gesamten vorherigen Historie in jedem Commit verwendet, ebenso ist eine Validierung durch digitale Signaturen der Entwickler für einzelne Tags und Commits möglich.
Im Vergleich zur vorherigen Version wurden in die neue Version 679 Änderungen übernommen, die mit der Beteiligung von 85 Entwicklern vorbereitet wurden, von denen 23 zum ersten Mal an der Entwicklung teilnahmen. Die wichtigsten Neuerungen sind:
- Das Kommando „git maintenance“ wurde hinzugefügt, das es ermöglicht, regelmäßige Arbeiten auf Systemen, die cron nicht unterstützen, auszuführen. Zum Beispiel kann mit dem neuen Befehl ein periodischer Start des Repository-Packungsprozesses organisiert werden, um nicht auf den Abschluss der Sperrung des Repositories zu warten, während verschiedene Befehle ausgeführt werden. Der Befehl „git maintenance“ ermöglicht es, Optimierungen und Wartungsoperationen für die optimale Struktur des Repositories im Hintergrund auszuführen, ohne die interaktive Sitzung zu blockieren — einmal pro Stunde wird eine Arbeit zur vorausschauenden Speicherung frischer Objekte aus dem entfernten Repository und zur Aktualisierung der Commit-Graphdatei ausgeführt, und jede Nacht wird der Packungsprozess des Repositories gestartet.
- Die Unterstützung für die Verwaltung der Rückwärtsindizes (revindex) für Packdateien wurde hinzugefügt. Erinnern wir uns, dass Git alle Daten in Form von Objekten speichert, die in separaten Dateien abgelegt werden. Um die Effizienz der Arbeit mit dem Repository zu erhöhen, werden Objekte zusätzlich in Packdateien abgelegt, in denen die Informationen in Form eines Stroms von Objekten präsentiert werden, die aufeinander folgen (ein ähnliches Format wird bei der Übertragung von Objekten mit den Befehlen git fetch und git push verwendet). Für jede Packdatei wird eine Indexdatei (.idx) erstellt, die es ermöglicht, durch die Objekt-ID sehr schnell den Offset in der Packdatei zu bestimmen, an dem dieses Objekt gespeichert ist. Der in Git 2.31 eingeführte Rückwärtsindex (.rev) zielt darauf ab, den Prozess der Identifizierung der Objekt-ID basierend auf den Informationen über die Platzierung des Objekts in der Packdatei zu optimieren.
Früher wurde eine solche Umwandlung zur Laufzeit während der Analyse der Packdatei durchgeführt und nur im Speicher gehalten, was eine Wiederverwendung solcher Indizes verhinderte und zwang, den Index jedes Mal neu zu generieren. Der Vorgang zum Erstellen des Indexes beschränkt sich auf den Aufbau eines Arrays von „Objekt-Position“-Paaren und dessen Sortierung nach Position, was für große Packdateien viel Zeit in Anspruch nehmen kann.
Zum Beispiel wurde der Vorgang zur Ausgabe des Inhalts von Objekten, bei dem ein direkter Index verwendet wird, 62 Mal schneller ausgeführt als der Vorgang zur Anzeige der Größe von Objekten, für den die Daten zur Zuordnung von Position und Objekt nicht indiziert wurden. Nach der Verwendung des Rückwärtsindex benötigen die genannten Vorgänge ungefähr die gleiche Zeit. Rückwärtsindizes ermöglichen auch eine Beschleunigung der Objektübertragungsoperationen bei den Befehlen fetch und push, da die bereits fertigen Daten direkt von der Festplatte übertragen werden. Standardmäßig werden Rückwärtsindizes nicht erstellt; um sie zu generieren, ist es erforderlich, die Einstellung „git config pack.writeReverseIndex true“ zu aktivieren und anschließend das Repository mit dem Befehl „git repack -Ad“ zu packen.
- Die Leistungsoptimierungen basieren auf der Einführung eines neuen Dateiformats für commit-graphs, das zur Optimierung des Zugriffs auf Informationen über Commits dient, sowie auf neuen Daten zur Generationsnummer des Commits, die zur Beschleunigung zusätzlicher Vorgänge mit Commits verwendet werden können.
- Die Möglichkeit, den Namen des Hauptzweigs, der standardmäßig in neuen Repositories verwendet wird (Einstellung init.defaultBranch), zu überschreiben, wurde hinzugefügt. Wenn auf externe Repositories zugegriffen wird, versucht Git, den Branch abzurufen, auf den HEAD verweist, d.h. wenn das externe Server Repository standardmäßig den Branch „main“ verwendet, wird der Befehl „git clone“ versuchen, „main“ lokal abzurufen. In Git 2.31 wird diese Art des Abrufs jetzt auch für leere Repositories unterstützt. Beispielsweise wird beim lokalen Klonen eines neuen Repositories, bevor die ersten Patches hinzugefügt werden, die lokale Kopie nun den externen Server Standard-Hauptbranch-Namen enthalten.
- Dem Befehl „git rev-list“ wurde die Option „—disk-usage“ hinzugefügt, um zusammenfassende Informationen über die Größe der Objekte anzuzeigen.
- In Erwartung des bevorstehenden Wechsels des Backends zur Durchführung von Zusammenführungen wurde die Erkennung von Umbenennungen erheblich optimiert.
- Die Unterstützung der veralteten regulären Ausdrucksbibliothek PCRE1 wurde eingestellt.
- Es wird die Möglichkeit eingeräumt, die Verwendung von verkürzten Links unabhängig vom Hash-Algorithmus zwangsweise zu verbieten. Das Verbot wird aktiviert, indem der Wert „no“ dem Parameter core.abbrev zugewiesen wird.
- Dem Befehl „git rev-parse“ wurde die Option „—path-format=(absolute|relative)“ hinzugefügt, um die Ausgabe relativer oder absoluter Pfade explizit zu definieren.
- Das Hinzufügen von Autocompletion-Regeln für eigene Unterbefehle von „git“ in Bash-Skripten wurde erleichtert.
- Dem Befehl „git bundle“ wurde die Option „—stdin“ hinzugefügt, um Links aus dem Standard-Eingabestrom zu lesen.
- Dem Befehl „git log“ wurde eine neue Option „—diff-merges=<how>“ hinzugefügt.
- Dem Befehl „git ls-files“ wurde die Option „—deduplicatecan“ hinzugefügt, um Duplikate in der Ausgabe zu eliminieren.
- Neue Masken zum Ausschließen von Commit-Bereichen wurden hinzugefügt – „<rev>^!“ und „<rev>^-<n>“.
- Dem Befehl „git range-diff“ wurden die Optionen „—left-only“ und „—right-only“ hinzugefügt, um nur eine Seite des vergleichenden Bereichs anzuzeigen.
- Dem Befehl „git diff“ und „git log“ wurden die Optionen „—skip-to=<path>“ und „—rotate-to=<path>“ hinzugefügt, um Beginnwege zu überspringen oder zum Ende zu verschieben.
- Dem Befehl „git difftool“ wurde die Option „—skip-to=<path>“ hinzugefügt, um die unterbrochene Sitzung von einem beliebigen Pfad aus fortzusetzen.
- Der Verhaltenskodex (Code-of-conduct), der die grundlegenden Prinzipien zur Lösung konfliktärer Situationen zwischen Entwicklern festlegt, wurde auf Version 2.0 aktualisiert (zuvor wurde Version 1.4 verwendet).
Quelle: opennet.ru
