Nach zwei Monaten Entwicklung wurde die Version 2.51 des verteilten Systems zur Verwaltung von Quelltexten Git veröffentlicht. Git zeichnet sich durch hohe Leistung aus und bietet Mittel fĂŒr nicht-lineare Entwicklung, die auf Verzweigung und ZusammenfĂŒhrung von Branches basieren. Um die IntegritĂ€t der Historie und die Resistenz gegen nachtrĂ€gliche Ănderungen sicherzustellen, wird eine implizite Hash-Funktion auf die gesamte vorherige Historie in jedem Commit angewendet, sowie die Zertifizierung von einzelnen Tags und Commits durch digitale Signaturen der Entwickler. Der Git-Code wird unter der GPLv2+-Lizenz verbreitet.
Im Vergleich zur vorherigen Version wurden in die neue Version 506 Ănderungen aufgenommen, die mit der Teilnahme von 91 Entwicklern vorbereitet wurden (21 waren zum ersten Mal an der Entwicklung von Git beteiligt). Die wichtigsten Neuerungen (1, 2, 3):
- Die Leistung der Befehle «git push» und «git fetch» in Repositories mit einer groĂen Anzahl von Referenzen wurde verbessert. Die Beschleunigung wurde durch das Aktualisieren von Referenzen im Batch-Modus erreicht, bei dem in einer Transaktion mehrere Referenzen gleichzeitig verarbeitet werden, anstatt fĂŒr jede Referenz eine separate Transaktion zum Aktualisieren zu erstellen. Diese Optimierung hat die Geschwindigkeit des «reftable»-Backends deutlich erhöht, welches jetzt das «files»-Backend in der Leistung ĂŒbertrifft. Beispielsweise stieg die Leistung von «git fetch» bei Verwendung des «reftable»-Backends in einem Test-Repository mit 10.000 Referenzen um das 22-Fache, wĂ€hrend sie beim «files»-Backend um das 1,25-Fache zunahm. FĂŒr «git push» betrug die Steigerung 18 und 1,21-fach, jeweils.
- Eine neue Methode zur Verpackung von Teilen des Repositories in Packdateien wurde vorgeschlagen, die nicht mit der Verfolgung unerreichbarer Objekte verbunden sind, auf die im Repository keine Referenzen existieren (keine Branches oder Tags verweisen darauf). Informationen ĂŒber unerreichbare Objekte werden in separaten Packdateien (»cruft packs«) gespeichert, was die Notwendigkeit mit sich brachte, sie in mehrpackindizes MIDX (multi-pack index) widerzuspiegeln, um Objekte abzudecken, die ursprĂŒnglich unerreichbar waren und nur im cruft-Pack gespeichert wurden, aber nach einem Commit, das sich auf sie bezieht, erreichbar wurden.
In der neuen Version wurde beim Repacken von Packdateien sichergestellt, dass zusĂ€tzliche Kopien erreichbarer Objekte, die nur in Cruft-Dateien gespeichert sind, erhalten bleiben. Diese Ănderung gewĂ€hrleistet, dass im Satz der Packdateien, die zur Speicherung erreichbarer Objekte verwendet werden, keine Objekte enthalten sind, die auf andere Objekte verweisen, die auĂerhalb dieses Satzes gespeichert sind. Um unerreichbare Inhalte von Cruft-Dateien aus den multiplen Pack-Indizes (MIDX) auszuschlieĂen, wurde die Einstellung "repack.MIDXMustContainCruft" vorgeschlagen, die es ermöglicht, die GröĂe solcher Indizes deutlich zu reduzieren. Die Aktivierung dieser Einstellung in einem GitHub-Repository hat die GröĂe der MIDX-Indizes um 38 % verringert, die Schreibgeschwindigkeit in die MIDX-Indizes um 35 % erhöht und die Lesegeschwindigkeit um 5 % gesteigert.
- Dem Befehl âgit pack-objectsâ wurde die Option ââpath-walkâ hinzugefĂŒgt, die eine neue Methode zur Informationssammlung ĂŒber Objekte beim Repacken von Packdateien umfasst. Anstelle der Durchsuchung von Objekten in der Reihenfolge der Revisionen werden im Modus ââpath-walkâ Objekte durch das Durchlaufen von Dateipfaden aufgelistet, was es ermöglicht, alle Objekte mit demselben Dateipfad gleichzeitig zu verpacken. Dieser Ansatz eliminiert die Heuristik, die Hashing verwendet, um die Beziehung eines Objekts zu seinem Dateipfad festzustellen, und ermöglicht es, die Objekte vor dem Verpacken nicht sortieren zu mĂŒssen. Bei der Verwendung des Modus ââpath-walkâ ist die GröĂe der generierten Packdateien erheblich kleiner als bei der Gruppierung von Objekten mithilfe von Hashes.
- Ein Format fĂŒr den Austausch von gespeicherten ZustĂ€nden des Arbeitsbaums und der Indizes im Repository, die mit dem Befehl âgit stashâ erstellt wurden, wurde definiert. Das neue Format ermöglicht es, die gespeicherten Ănderungen (stash-EintrĂ€ge) als eine Sequenz von Commits zu kodieren. FĂŒr den Import und Export wurden die Unterbefehle âgit stash importâ und âgit stash exportâ vorgeschlagen, die verwendet werden können, um gespeicherte ZustĂ€nde von einem System auf ein anderes zu ĂŒbertragen und Push- oder Pull-Operationen mit diesen ZustĂ€nden wie mit normalen Branches oder Tags durchzufĂŒhren. git stash export âto-ref refs/stashes/my-stash git push origin refs/stashes/my-stash ⊠git fetch origin â+refs/stashes/*:refs/stashes/*â git stash import refs/stashes/my-stash
- Im Befehl âgit cat-fileâ, der den Inhalt gegebener Objekte ausgibt, wurde die Möglichkeit implementiert, Informationen ĂŒber fehlende Objekte (zum Beispiel aufgrund von Repository-BeschĂ€digungen) und Submodule anzuzeigen, wenn die Optionen ââbatchâ und ââbatch-checkâ verwendet werden. FrĂŒher gab der Befehl âgit cat-file âbatch-checkâ bei Angabe des Pfades zu einem Submodul âmissingâ aus, jetzt wird die Objekt-ID angezeigt.
- Im Befehl âgit logâ werden Optimierungen auf Grundlage von Bloom-Filtern eingesetzt, um die Suche in der Historie von Ănderungen zu beschleunigen, wenn Filter mit mehreren Dateipfaden angegeben werden, zum Beispiel âgit log â path/to/a path/to/bâ.
- Die Befehle âgit switchâ und âgit restoreâ wurden stabilisiert, die seit 2019 als experimentell betrachtet wurden. Die Befehle werden als moderne Ăquivalente zu âgit checkoutâ prĂ€sentiert, die so unterschiedliche Funktionen dieser Befehle wie das Verwalten von Branches (Wechseln und Erstellen) und das Wiederherstellen von Dateien im Arbeitsverzeichnis voneinander trennen.
- Der Befehl âgit whatchangedâ, der Ă€quivalent zu âgit log ârawâ ist, wurde als veraltet erklĂ€rt und ist zur Entfernung in der Git-Version 3.0 vorgesehen.
- Im Befehl âgit for-each-refâ wurde die Option ââstart-afterâ hinzugefĂŒgt, die zusammen mit der Option ââcountâ fĂŒr eine paginierte Ausgabe verwendet werden kann.
- Im Befehl âgit mergeâ und âgit pullâ wurde die Option ââcompact-summaryâ hinzugefĂŒgt, um ein kompaktes Format fĂŒr die Zusammenfassung von Ănderungen anstelle des diffstat-Formats zu verwenden.
- In der Git-Codebasis ist die Verwendung des SchlĂŒsselworts âboolâ, das im C99-Standard eingefĂŒhrt wurde, erlaubt. Einige in Git experimentell verwendete C99-Funktionen sind ebenfalls dokumentiert (zum Beispiel wird geplant, Mitte 2026 die Verwendung von Konstruktionen â(struct foo){ .member = value };â zuzulassen). Ein C99-kompatibler Compiler wird seit 2021 fĂŒr Git vorausgesetzt, doch die Funktionen der C99-Spezifikation werden sehr vorsichtig umgesetzt, um die KompatibilitĂ€t mit Compilern zu wahren, die nur teilweise diesen Standard unterstĂŒtzen.
- Die Regeln fĂŒr die Annahme von Patches wurden geĂ€ndert, um die Einreichung von Patches unter einem Pseudonym zuzulassen, nicht nur unter dem echten Namen des Entwicklers. Diese Ănderung entspricht den Regeln fĂŒr die Annahme von Patches im Linux-Kernel.
- Die Liste der inkompatiblen Ănderungen wurde aktualisiert, die in der Git-Version 3.0 angewendet werden. Zu den wesentlichen Ănderungen in der bevorstehenden Version Git 3.0 gehört die standardmĂ€Ăige Umstellung auf Objekt-IDs basierend auf dem SHA-256-Hashalgorithmus bei der Initialisierung neuer Repositories sowie die Verwendung des Formats âreftableâ zur Speicherung von Verweisen auf Branches und Tags im Repository (unter Verwendung des Blockspeichers des JGit-Projekts, der fĂŒr die Speicherung einer sehr groĂen Anzahl von Verweisen optimiert wurde).
Quelle: opennet.ru
