Nach zwei Monaten der Entwicklung wird die Version 2.51 des verteilten Systems zur Verwaltung von Quelltexten Git vorgestellt. Git zeichnet sich durch hohe LeistungsfĂ€higkeit aus und bietet Mittel zur nichtlinearen Entwicklung, die auf Verzweigung und ZusammenfĂŒhrung von Zweigen basieren. Um die IntegritĂ€t der Historie und die Robustheit gegenĂŒber nachtrĂ€glichen Ănderungen zu gewĂ€hrleisten, werden das implizite Hashing der gesamten vorherigen Historie in jedem Commit sowie die digitale Signatur der Entwickler fĂŒr einzelne Tags und Commits verwendet. Der Quellcode von Git wird unter der GPLv2+-Lizenz verteilt.
Im Vergleich zur vorherigen Version wurden 506 Ănderungen in die neue Version aufgenommen, die mit Beteiligung von 91 Entwicklern erstellt wurden (21 davon haben zum ersten Mal an der Entwicklung von Git teilgenommen). Die wichtigsten Neuerungen (1, 2, 3):
- Die Leistung der Befehle "git push" und "git fetch" in Repositories mit einer groĂen Anzahl an Referenzen wurde verbessert. Diese Beschleunigung resultiert aus der Aktualisierung von Referenzen im Batch-Modus, bei dem mehrere Referenzen in einer Transaktion verarbeitet werden, anstatt fĂŒr jede Referenz eine separate Transaktion zu erstellen. Diese Optimierung hat die Geschwindigkeit des "reftable"-Backends erheblich gesteigert, welches nun das "files"-Backend ĂŒbertrifft. Beispielsweise wurde im Test-Repository mit 10.000 Referenzen die Leistung von "git fetch" beim Einsatz des "reftable"-Backends um das 22-Fache gesteigert, wĂ€hrend es beim "files"-Backend nur um das 1,25-Fache zunahm. FĂŒr "git push" betrug der Zuwachs 18 und 1,21 mal, jeweils.
- Eine neue Methode zum Verpacken in Pack-Dateien fĂŒr Teile des Repositories wurde vorgeschlagen, die nicht mit unerreichbaren Objekten verknĂŒpft sind, auf die im Repository keine Links bestehen (weder von Branches noch von Tags). Informationen ĂŒber unerreichbare Objekte werden in separaten Pack-Dateien (âcruft packsâ) gespeichert, was eine Abbildung in mehrpack-indizes (MIDX, multi-pack index) erforderte, um Objekte zu erfassen, die ursprĂŒnglich unerreichbar waren und nur im Cruft-Paket gespeichert wurden, aber nach einem auf sie verweisenden Commit erreichbar wurden.
In der neuen Version wird beim Repacking von Pack-Dateien sichergestellt, dass zusĂ€tzliche Kopien der erreichbaren Objekte, die nur in Cruft-Dateien gespeichert sind, erhalten bleiben. Diese Ănderung gewĂ€hrleistet, dass der Satz von Pack-Dateien, der fĂŒr die Speicherung der erreichbaren Objekte verwendet wird, keine Objekte enthĂ€lt, die auf andere Objekte verweisen, die auĂerhalb dieses Satzes gespeichert sind. Um unerreichbare Inhalte von Cruft-Dateien aus den multipack-Index (MIDX) zu entfernen, wurde die Einstellung ârepack.MIDXMustContainCruftâ vorgeschlagen, die es ermöglicht, die GröĂe solcher Indizes erheblich zu reduzieren. Die Aktivierung dieser Einstellung im GitHub-Repository fĂŒhrte zu einer Reduktion der GröĂe der MIDX-Indizes um 38 %, zu einer Beschleunigung des Schreibens in die MIDX-Indizes um 35 % und zu einer Verbesserung der Leseleistung um 5 %.
- Der Befehl âgit pack-objectsâ wurde um die Option ââpath-walkâ erweitert, die eine neue Methode zur Informationsbeschaffung ĂŒber Objekte beim Wiederpacken von Pack-Dateien einfĂŒhrt. Anstatt die Objekte in Reihenfolge der Revisionen zu durchlaufen, werden im Modus ââpath-walkâ die Objekte durch das Durchlaufen von File-Pfaden aufgezĂ€hlt, was es ermöglicht, alle Objekte mit demselben File-Pfad gleichzeitig zu packen. Dieser Ansatz erlaubt es, die Heuristik, die Hashing verwendet, um die Beziehung des Objekts zu seinem File-Pfad zu bestimmen, auszuschlieĂen und die Objekte vor dem Packen nicht sortieren zu mĂŒssen. Im Modus ââpath-walkâ ist die GröĂe der generierten Pack-Dateien deutlich geringer als bei der Gruppierung von Objekten durch Hashes.
- Das Format fĂŒr den Austausch von gespeicherten ZustĂ€nden des Arbeitsverzeichnisses und von Indizes im Repository, die mit dem Befehl «git stash» erstellt werden, ist definiert. Das neue Format ermöglicht es, gespeicherte Ănderungen (stash-EintrĂ€ge) als eine Sequenz von Commits zu kodieren. FĂŒr den Import und Export stehen die Unterbefehle «git stash import» und «git stash export» zur VerfĂŒgung, mit denen gespeicherte ZustĂ€nde von einem System auf ein anderes ĂŒbertragen und Push- oder Pull-Operationen mit diesen ZustĂ€nden wie mit normalen Branches oder Tags durchgefĂŒhrt werden können. 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 bestimmter Objekte anzeigt, wurde bei der Verwendung der Optionen «âbatch» und «âbatch-check» die Möglichkeit implementiert, Informationen ĂŒber fehlende Objekte (zum Beispiel aufgrund einer BeschĂ€digung des Repositories) und Submodule anzuzeigen. Zuvor gab die Angabe eines Pfades zu einem Submodul im Befehl «git cat-file âbatch-check» «missing» aus, jetzt wird die Objekt-ID angezeigt.
- Im Befehl âgit logâ wurden Optimierungen basierend auf Bloom-Filtern implementiert, um die Suche in der Ănderungsvergangenheit zu beschleunigen, wenn mehrere Dateipfade angegeben werden, z. B. âgit log â path/to/a path/to/b.â
- Die Befehle âgit switchâ und âgit restoreâ wurden stabilisiert, die seit 2019 als experimentell betrachtet wurden. Diese Befehle werden als moderne Ăquivalente zu âgit checkoutâ prĂ€sentiert und trennen solche wenig miteinander verbundenen Funktionen wie das Verwalten von Branches (Wechseln und Erstellen) und das Wiederherstellen von Dateien im Arbeitsverzeichnis.
- Der Befehl âgit whatchangedâ, der Ă€quivalent zu âgit log ârawâ ist, wurde als veraltet erklĂ€rt und soll in der Git-Version 3.0 entfernt werden.
- Im Befehl âgit for-each-refâ wurde die Option ââstart-afterâ hinzugefĂŒgt, die zusammen mit der Option ââcountâ verwendet werden kann, um eine paginierte Ausgabe zu organisieren.
- Den Befehlen âgit mergeâ und âgit pullâ wurde die Option ââcompact-summaryâ hinzugefĂŒgt, um ein kompaktes Format der Zusammenfassungsinformationen ĂŒber Ă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. Auch einige Funktionen von C99, die experimentell in Git genutzt werden, sind dokumentiert (zum Beispiel wird geplant, Mitte 2026 die Verwendung von Konstruktionen wie â(struct foo){ .member = value };â zuzulassen). Ein Compiler, der C99 unterstĂŒtzt, ist seit 2021 fĂŒr Git erforderlich, doch die Funktionen der C99-Spezifikation werden sehr vorsichtig implementiert, um die KompatibilitĂ€t mit Compilern, die diesen Standard nur teilweise unterstĂŒtzen, zu wahren.
- Die Regeln zur Abnahme von Patches wurden geĂ€ndert, um das Einreichen von Patches unter einem Pseudonym zu erlauben, nicht nur unter dem echten Namen des Entwicklers. Diese Ănderung entspricht den Patchannahmeregeln fĂŒr den Linux-Kernel.
- Die Liste der inkompatiblen Ănderungen wurde aktualisiert, die in der Git-Version 3.0 angewendet werden. Zu den bedeutenden Ănderungen in der bevorstehenden Veröffentlichung von Git 3.0 gehört der standardmĂ€Ăige Wechsel zu objektbasierten Identifikatoren, die auf dem SHA-256 Hashalgorithmus basieren, bei der Initialisierung neuer Repositories sowie die Verwendung des 'reftable'-Formats zur Speicherung von Verweisen auf Branches und Tags im Repository (unter Verwendung von blockbasierter Speicherung aus dem JGit-Projekt, optimiert fĂŒr die Speicherung einer sehr groĂen Anzahl von Verweisen).
Quelle: opennet.ru
