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
