Nach zwei Monaten Entwicklung wurde die Version 2.39 des verteilten Systems zur Verwaltung von Quelltexten Git veröffentlicht. Git gehört zu den beliebtesten, zuverlĂ€ssigsten und leistungsfĂ€higsten Versionsverwaltungssystemen und bietet flexible Möglichkeiten fĂŒr nichtlineare Entwicklungen, die auf Branching und Merging basieren. Um die IntegritĂ€t der Historie zu gewĂ€hrleisten und Ănderungen "rĂŒckwirkend" zu verhindern, wird die gesamte vorherige Historie in jedem Commit implizit gehasht; zudem ist die BestĂ€tigung durch digitale Signaturen der Entwickler fĂŒr einzelne Tags und Commits möglich.
Im Vergleich zur vorherigen Version wurden 483 Ănderungen in die neue Version aufgenommen, die von 86 Entwicklern vorbereitet wurden, von denen 31 erstmals an der Entwicklung teilnahmen. Die wichtigsten Neuerungen sind:
- Das Kommando âgit shortlogâ, das zur Anzeige von Zusammenfassungen mit Statistiken aus der Ănderungshistorie dient, wurde um die Option ââgroupâ erweitert, um die Gruppierung von Commits nach beliebigen Feldern zu ermöglichen, die nicht auf den Autor oder Commiter beschrĂ€nkt sind. Um beispielsweise eine Liste der Entwickler anzuzeigen, die Informationen ĂŒber die Anzahl der Ănderungen enthĂ€lt und Co-Autoren berĂŒcksichtigt, die im Feld âCo-authored-byâ erwĂ€hnt werden, kann der Befehl verwendet werden: git shortlog -ns âgroup=author âgroup=trailer:co-authored-by
Die Ausgabe des shortlogs kann mithilfe von Format-Spezifizierern aggregiert werden, und die Option ââgroupâ erleichtert erheblich die Erstellung komplexer Berichte, wodurch zusĂ€tzliche Sortierbefehle vermieden werden. Um beispielsweise einen Bericht darĂŒber zu erstellen, wie viele Commits fĂŒr eine bestimmte Version in jedem Monat akzeptiert wurden, können Sie angeben: git shortlog v2.38.0.. âdate=âformat:%Y-%mâ âgroup=ââ -s 2 2022-08 47 2022-09 405 2022-10 194 2022-11 5 2022-12. FrĂŒher hĂ€tte fĂŒr einen Ă€hnlichen Vorgang die Nutzung der Tools sort und uniq erforderlich gewesen: git log v2.38.0.. âdate=âformat:%Y-%mâ âformat=ââ | sort | uniq -c
- Die Funktionen des Mechanismus âcruft packsâ wurden erweitert, um unerreichbare Objekte, auf die im Repository keine Verweise existieren (weder durch Branches noch durch Tags), zu verpacken. Unerreichbare Objekte werden vom Garbage Collector entfernt, bleiben jedoch zunĂ€chst eine gewisse Zeit im Repository, um Rennbedingungen auszuschlieĂen. Der âcruft packsâ-Mechanismus ermöglicht die Speicherung aller unerreichbaren Objekte in einer einzigen Pack-Datei, wĂ€hrend die Ănderungszeit jedes Objekts in einer separaten Tabelle festgehalten wird, die in einer eigenen Datei mit der Erweiterung â.mtimesâ gespeichert wird, um eine Ăberschneidung mit der allgemeinen Ănderungszeit zu vermeiden.
Die Zeitspanne, in der unerreichbare Objekte im Repository verbleiben, bevor sie tatsĂ€chlich gelöscht werden, wird durch die Option ââprune=â definiert. Obwohl die Verzögerung vor der Löschung eine recht effektive und praktische Methode ist, um Repository-SchĂ€den durch Wettlaufbedingungen zu verhindern, ist sie nicht zu 100 % zuverlĂ€ssig. Um die Wiederherstellung eines beschĂ€digten Repositories zu erleichtern, bietet die neue Version die Möglichkeit, fehlende Objekte zu speichern. DafĂŒr wurde der Befehl âgit repackâ um die Option ââexpire-toâ erweitert, die es ermöglicht, eine Datei anzugeben, um eine externe Kopie aller zu löschenden Objekte zu erstellen. Zum Beispiel kann man zur Speicherung von unerreichbaren Objekten, die sich in den letzten 5 Minuten nicht geĂ€ndert haben, folgenden Befehl verwenden: git repack âcruft âcruft-expiration=5.minutes.ago -d âexpire-to=../backup.git
- Die Geschwindigkeit der AusfĂŒhrung des Befehls âgit grep âcachedâ wurde erheblich erhöht (um bis zu 70 %) bei Suchen in Bereichen, in denen partielles Klonen (sparse-checkout) angewendet wird und fĂŒr die partielle Indizes (sparse index) existieren. Zuvor wurde bei Angabe der Option ââcachedâ zuerst im regulĂ€ren Index und danach in den partiellen Indizes gesucht, was zu spĂŒrbaren Verzögerungen bei Suchen in groĂen Repositorien fĂŒhrte.
- Die AusfĂŒhrung wurde beschleunigt um Server die ĂberprĂŒfung der Konsistenz neuer Objekte, bevor sie in das Repositorium eingefĂŒgt werden, bei AusfĂŒhrung des Befehls âgit pushâ. Durch die Umstellung auf die ĂberprĂŒfung nur der deklarierten Referenzen konnten in einem Test-Repositorium mit 7 Millionen Referenzen, von denen nur 3 % durch den Push-Befehl erfasst werden, die Optimierungen die ĂberprĂŒfungszeit um das 4,5-fache verkĂŒrzen.
- Um vor potenziellen ganzzahligen ĂberlĂ€ufen im Code zu schĂŒtzen, wurde die maximale GröĂe der verarbeiteten Patches im Befehl âgit applyâ begrenzt. Wenn die Patch-GröĂe 1 GB ĂŒberschreitet, wird jetzt ein Fehler ausgegeben.
- Um potenzielle SicherheitsanfĂ€lligkeiten zu vermeiden, wurden Ănderungen vorgenommen, um ĂŒberflĂŒssige Informationen aus den Kopfzeilen zu entfernen, die beim Einsatz des Moduls h2h3 mit den Optionen GIT_TRACE_CURL=1 oder GIT_CURL_VERBOSE=1 zusammen mit HTTP/2 ausgegeben werden.
- Bei der AusfĂŒhrung des Check-Out-Befehls mit einem Branch, der ein symbolischer Verweis auf einen anderen Branch ist, gibt der Befehl âgit symbolic-ref HEADâ jetzt den Namen des Ziel-Branches und nicht den Namen des symbolischen Verweises aus.
- Die UnterstĂŒtzung des Arguments @{-1} in der Option ââedit-descriptionâ (âgit branch âedit-description @{-1}â) wurde hinzugefĂŒgt, um die Beschreibung des vorherigen Branches zu bearbeiten.
- Der Befehl âgit merge-tree âstdinâ wurde hinzugefĂŒgt, der es ermöglicht, eine Liste von Parametern ĂŒber den Standard-Eingabestrom zu ĂŒbergeben.
- Bei Netzwerkdateisystemen ist der fsmonitor, der Ănderungen im Dateisystem ĂŒberwacht, standardmĂ€Ăig deaktiviert.
Quelle: opennet.ru
