Veröffentlichung des Versionsverwaltungssystems Git 2.51

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

60GB SSD 8Gb DDR4