Website-Suche

Git 2.47 veröffentlicht mit neuen Funktionen und Verbesserungen


Das Git-Projekt hat Git 2.47 veröffentlicht, vollgepackt mit neuen Funktionen, Leistungsverbesserungen und Fehlerbehebungen. Diese Version führt mehrere bemerkenswerte Änderungen ein, darunter inkrementelle Multi-Pack-Indizes, verbesserte Zweig-Identifikation mit 'for-each-ref', eine formale Plattformunterstützungspolitik und erweiterten Unit-Test-Abdeckungsgrad.

Inkrementelle Multi-Pack-Indizes: Leistungssteigerung für große Repositories

Git 2.47 führt eine neue experimentelle Funktion ein: inkrementelle Multi-Pack-Indexes. Diese Funktion behebt Leistungsengpässe, die mit Repositories verbunden sind, die zahlreiche Packfiles enthalten.

Die Herausforderung verstehen

  • Git speichert Objekte (Blobs, Bäume, Commits, Tags) auf zwei Arten: locker (Einzeldateien) oder gepackt (mehrere Objekte in einer einzelnen Packdatei).
  • Packfiles bieten Vorteile wie eine bessere Cache-Lokalität und Delta-Kompression, was zu kleineren Repository-Größen führt.
  • Wenn jedoch die Anzahl der Packdateien wächst, werden Objektabfragen langsamer, da Git durchsuchen muss, jede Packdatei zu durchsuchen.
  • Umpacken (Zusammenführen von Packdateien) verbessert die Suchzeiten, kann aber bei großen Repositories ressourcenintensiv sein.
  • Multi-Pack-Indizes (MIDX) wurden in Git 2.21 eingeführt, um die Objektsuche über mehrere Packdateien zu beschleunigen, indem sie als Karte zwischen Objekten und deren Speicherort innerhalb der Packdateien fungieren.
  • Das Erstellen und Aktualisieren von MIDXs kann jedoch auch zeitaufwendig für große Repositories sein.

Die inkrementelle MIDX-Lösung

Inkrementelle Multi-Pack-Indizes zielen darauf ab, MIDX-Aktualisierungen zu optimieren, indem sie die Speicherung mehrerer MIDXs in einer Kette von Schichten ermöglichen:

  • Jede Schicht enthält Objekte, die sich von den vorherigen Schichten unterscheiden, was schnellere Aktualisierungen durch Anhängen ermöglicht.
  • Das bedeutet, dass Updates Zeit in Anspruch nehmen, die proportional zu den hinzugefügten neuen Objekten ist, nicht zur gesamten MIDX-Größe.
  • Obwohl in Git 2.47 noch experimentell, wird erwartet, dass die inkrementelle MIDX-Unterstützung die Skalierbarkeit großer Repositories verbessert.

Verwendung von inkrementellen MIDXs

Sie können diese experimentelle Funktion ausprobieren, indem Sie Folgendes ausführen:

git multi-pack-index write --incremental

Dieser Befehl fügt neue Packs zum bestehenden MIDX Ihres Repositories hinzu.

Schnelles Finden von Basisbranches mit 'for-each-ref'

Die Bestimmung des Basis-Branches eines Commits kann schwierig sein. Git 2.47 vereinfacht dies mit einem neuen Atom für die for-each-ref-Option --format.

Das Problem

  • Die Identifizierung des Basis-Branches eines Commits umfasst oft das Auffinden des Branches mit den wenigsten eindeutigen First-Parent-Commits, die zu diesem Commit führen.
  • Dies spiegelt den dem betreffenden Commit nächstgelegenen primären Entwicklungsweg wider.
  • Allerdings liefern vorhandene Werkzeuge wie 'git rev-list' diese Information nicht direkt.

Die Lösung: '%(is-base:)' Atom

  • Das neue '%(is-base:)' Atom innerhalb von for-each-ref --format hilft dabei, den wahrscheinlichsten Basis-Branch für einen bestimmten Commit zu bestimmen.

Beispielverwendung

git for-each-ref --format='%(refname) %(objectname) %(upstream:remoteref)' refs/heads

Dieser Befehl iteriert durch Branch-Heads, zeigt deren Namen, Commit-Hashes und ob sie wahrscheinlich Basis-Branches für den durch "COMMIT-HASH" angegebenen Commit sind.

Formelle Plattformunterstützungspolitik

Git 2.47 führt eine formale Plattformunterstützungspolitik ein, um Richtlinien für unterstützte Plattformen und deren Wartung bereitzustellen.

Hauptanforderungen

  • Plattformen müssen C99 oder C11 unterstützen, sich auf stabile/langfristig unterstützte Abhängigkeiten verlassen und aktive Sicherheitsunterstützung haben.
  • Diskussionen über die mögliche Einbeziehung von Rust als Abhängigkeit laufen weiterhin.

Vorteile

  • Diese Richtlinie gewährleistet eine konsistente Kompatibilität und Wartbarkeit über verschiedene Systeme und Architekturen hinweg.

Erweiterte Unit-Test-Abdeckung

Git 2.47 verzeichnet einen erheblichen Anstieg der Unit-Test-Abdeckung, was die Codequalität und Zuverlässigkeit verbessert.

Bemerkenswerte Verbesserungen

  • Reftable-Backend: Unit-Tests wurden von einem benutzerdefinierten Framework auf das Standard-Framework von Git migriert, was die Integration verbessert.
  • Hashmap-API, OID-Array, URL-Übereinstimmungsnormalisierung: Konvertierung von Shell-basierten Integrationstests zu Unit-Tests, die mehr Detailgenauigkeit und Robustheit bieten.
  • Clar Framework-Adoption: Die Integration des Clar-Unit-Testing-Frameworks (ursprünglich für libgit2 entwickelt) verbessert die Testmöglichkeiten von Git weiter.

Weitere bemerkenswerte Änderungen

  • 'git fsck'-Erweiterungen: Verbesserte Integritätsprüfungen für Referenzspeicher-Backends, einschließlich eines neuen Unterbefehls 'git refs verify' zur Erkennung von Referenzbeschädigungen.
  • Bereinigung ungenutzter Parameter: Eine mehrfache Veröffentlichungsinitiative zur Identifizierung und Behandlung ungenutzter Parameter gipfelt in Git 2.47, was zu saubererem und sichererem Code führt.
  • Speicherleck-Behebungen: Anhaltende Bemühungen zur Beseitigung von Speicherlecks tragen zur Eignung von Git für lang laufende Prozesse und Bibliotheksnutzung bei.
  • Visual Studio Code Integration: Der Befehl 'mergetool' von Git unterstützt jetzt nativ Visual Studio Code und erleichtert die 3-Wege-Merge-Auflösung.

Fazit

Git 2.47 bringt wertvolle Funktionen und Verbesserungen, die die Leistung, Benutzerfreundlichkeit und Wartbarkeit verbessern. Inkrementelle MIDXs versprechen eine bessere Skalierbarkeit, während Verbesserungen von 'for-each-ref' die Branch-Identifizierung vereinfachen. Die neue Plattformunterstützungspolitik und erweiterte Unit-Tests tragen zur Robustheit und Langlebigkeit von Git bei.

Ressource:

  • Highlights aus Git 2.47

Verwandte Lektüre:

  • Was ist Git und wie installiert man Git in Linux