Nach drei Monaten Entwicklung wurde die Veröffentlichung des verteilten Systems zur Verwaltung von Quelltexten Git 2.41 bekannt gegeben. Git ist eines der beliebtesten, zuverlĂ€ssigsten und leistungsstĂ€rksten Versionsverwaltungssysteme, das flexible Mittel fĂŒr nichtlineare Entwicklungen basierend auf Branching und Merging bereitstellt. Um die IntegritĂ€t der Historie und die WiderstandsfĂ€higkeit gegenĂŒber rĂŒckwirkenden Ănderungen zu gewĂ€hrleisten, wird eine implizite Hash-Wertung der gesamten vorhergehenden Historie in jedem Commit verwendet. Zudem ist es möglich, digitale Signaturen von Entwicklern fĂŒr einzelne Tags und Commits beizufĂŒgen.
Im Vergleich zur vorherigen Version wurden in die neue Version 542 Ănderungen ĂŒbernommen, die von 95 Entwicklern vorbereitet wurden, von denen 29 erstmals an der Entwicklung teilnahmen. Die Hauptneuerungen sind:
- Die Verarbeitung von unerreichbaren Objekten wurde verbessert, auf die im Repository keine Verweise (keine Branches oder Tags) existieren. Unerreichbare Objekte werden vom Garbage Collector gelöscht, verbleiben jedoch eine gewisse Zeit im Repository, um RennzustĂ€nde zu vermeiden. Um die Verweildauer unerreichbarer Objekte zu verfolgen, mĂŒssen Labels mit Zeitstempeln fĂŒr diese Objekte zugeordnet werden, was es nicht erlaubt, sie in einer einzigen Pack-Datei zu speichern, in der alle Objekte eine gemeinsame Ănderungszeit haben. FrĂŒher wurde jedes unerreichbare Objekt in einer separaten Datei gespeichert, was bei zahlreichen frischen unerreichbaren Objekten, die noch nicht gelöscht werden sollten, zu Problemen fĂŒhrte. In der neuen Version wird standardmĂ€Ăig der Mechanismus âcruft packsâ zum Packen unerreichbarer Objekte verwendet, der es ermöglicht, alle unerreichbaren Objekte in einer einzigen Pack-Datei zu speichern, wĂ€hrend die Informationen ĂŒber die Ănderungszeit jedes Objekts in einer separaten Tabelle gespeichert werden, die sich in einer Datei mit der Erweiterung â.mtimesâ befindet und ĂŒber eine Indexdatei mit der Erweiterung â.idxâ verknĂŒpft ist.

- StandardmĂ€Ăig ist die Verwendung des RĂŒckwĂ€rtsindex (revindex) fĂŒr Pack-Dateien aktiviert. Bei Tests im Repository torvalds/linux ermöglichte die Anwendung des RĂŒckwĂ€rtsindex eine 1,49-fache Beschleunigung ressourcenintensiver âgit pushâ-Operationen sowie eine 77-fache Beschleunigung einfacher Operationen, wie das Berechnen der GröĂe eines Objekts mittels âgit cat-file âbatch=â%(objectsize:disk)'â. Dateien (â.revâ) mit RĂŒckwĂ€rtsindex werden im Repository im Verzeichnis â.git/objects/packâ gespeichert.
Erinnern wir uns daran, dass Git alle Daten in Form von Objekten speichert, die in separaten Dateien abgelegt werden. Um die Effizienz der Arbeit mit dem Repository zu erhöhen, werden die Objekte zusĂ€tzlich in Pack-Dateien abgelegt, in denen die Informationen in Form eines Stroms von aufeinanderfolgenden Objekten dargestellt werden (ein Ă€hnliches Format wird beim Ăbertragen von Objekten mit den Befehlen git fetch und git push verwendet). FĂŒr jede Pack-Datei wird eine Indexdatei (.idx) erstellt, die es ermöglicht, anhand der Objekt-ID sehr schnell die Offsets in der Pack-Datei zu bestimmen, wo dieses Objekt gespeichert ist.
Der im neuen Release enthaltene RĂŒckwĂ€rtsindex zielt darauf ab, den Prozess der Identifizierung der Objekt-ID anhand der Informationen ĂŒber die Platzierung des Objekts in der Pack-Datei zu optimieren. Zuvor wurde eine solche Umwandlung wĂ€hrend der Analyse der Pack-Datei in Echtzeit durchgefĂŒhrt und nur im Speicher gehalten, was die Wiederverwendbarkeit solcher Indizes verhinderte und es erforderte, den Index jedes Mal neu zu generieren. Der Vorgang zum Erstellen des Indexes reduziert sich auf den Aufbau eines Arrays von âObjekt-Positionâ-Paaren und deren Sortierung nach Position, was bei groĂen Pack-Dateien viel Zeit in Anspruch nehmen kann.
Zum Beispiel wurde die Ausgabe des Inhalts von Objekten, bei der ein direkter Index verwendet wurde, 62-mal schneller durchgefĂŒhrt als die Anzeige der GröĂe von Objekten, fĂŒr die die Daten zur Beziehung zwischen Position und Objekt nicht indiziert wurden. Nach der Verwendung des RĂŒckwĂ€rtsindex benötigten die genannten Operationen etwa die gleiche Zeit. RĂŒckwĂ€rtsindizes ermöglichen es auch, die VorgĂ€nge beim Senden von Objekten bei den Befehlen fetch und push durch die direkte Ăbertragung bereits bereitgestellter Daten von der Festplatte zu beschleunigen.

- Im Protokoll âCredential Helperâ, das fĂŒr die Ăbertragung von Zugangsdaten beim Zugriff auf Repositories mit eingeschrĂ€nktem Zugriff verwendet wird, wurde die UnterstĂŒtzung fĂŒr die Ăbertragung von WWW-Authenticate-Headern zwischen dem Credential Handler und dem Dienst, wo die Authentifizierung erfolgt, hinzugefĂŒgt. Die UnterstĂŒtzung des WWW-Authenticate-Headers ermöglicht die Ăbertragung von OAuth-Scoped Parametern fĂŒr eine granularere Zugriffskontrolle des Benutzers auf die Repositories und die Abgrenzung von Bereichen, die fĂŒr Anfragen verfĂŒgbar sind.
- In den Befehl for-each-ref wurde eine Formatierungsoption â%(ahead-behind:<base>)â hinzugefĂŒgt, die es ermöglicht, auf einmal Informationen ĂŒber die Anzahl von Commits zu erhalten, die in einem bestimmten Branch vorhanden oder nicht vorhanden sind, im Vergleich zu einem anderen Branch (wie weit einer Branch hinter oder vor einem anderen in Bezug auf die Commits liegt). Zuvor mussten fĂŒr derartige Informationen zwei separate Befehle ausgefĂŒhrt werden: âgit rev-list âcount main..my-featureâ zur Ermittlung der Branch-spezifischen Commits und âgit rev-list âcount my-feature..mainâ zur Ermittlung der fehlenden Commits. Jetzt können derartige Berechnungen auf einen einzigen Befehl reduziert werden, was das Schreiben von Handlern vereinfacht und die AusfĂŒhrungszeit verkĂŒrzt. Zum Beispiel kann fĂŒr die Anzeige von nicht zusammengefĂŒhrten Branches und zur EinschĂ€tzung der Verzögerung oder Vorlaufzeit im Vergleich zum Hauptbranch eine Einzeiler verwendet werden: $ git for-each-ref âno-merged=origin/HEAD \ âformat=â%(refname:short) %(ahead-behind:origin/HEAD)â \ refs/heads/tb/ | column -t tb/cruft-extra-tips 2 96 tb/for-each-refâexclude 16 96 tb/roaring-bitmaps 47 3 anstelle des zuvor verwendeten Skripts, das 17-mal langsamer ausgefĂŒhrt wird: $ git for-each-ref âformat=â%(refname:short)â âno-merged=origin/HEAD \ refs/heads/tb | while read ref do ahead=â$(git rev-list âcount origin/HEAD..$ref)â behind=â$(git rev-list âcount $ref..origin/HEAD)â printf â%s %d %d\nâ â$refâ â$aheadâ â$behindâ done | column -t tb/cruft-extra-tips 2 96 tb/for-each-refâexclude 16 96 tb/roaring-bitmaps 47 3
- In den Befehl âgit fetchâ wurde die Option ââporcelainâ hinzugefĂŒgt, bei deren Angabe die Ausgabe im Format â<flag> <old-object-id> <new-object-id> <local-reference>â erstellt wird, das weniger lesbar, aber besser fĂŒr die Verarbeitung in Skripten geeignet ist.
- Eine Einstellung âfetch.hideRefsâ wurde hinzugefĂŒgt, die die âgit fetchâ-Operationen beschleunigt, indem sie einen Teil der Links im lokalen Repository wĂ€hrend der ĂberprĂŒfung auf den vollstĂ€ndigen Satz von Objekten auf Serverseite verbirgt, was Zeit spart, indem die ĂberprĂŒfung eingeschrĂ€nkt wird. Server, von denen Daten direkt abgerufen werden. Zum Beispiel hat bei einem Test auf einem System mit Repositories, die eine groĂe Anzahl an verfolgten externen Links enthalten, das AusschlieĂen aller Links auĂer den an das Ziel adressierten zu einem Server $remote, die AusfĂŒhrungszeit des Befehls âgit fetchâ von 20 Minuten auf 30 Sekunden verkĂŒrzt. $ git -c fetch.hideRefs=refs -c fetch.hideRefs=!refs/remotes/$remote \ fetch $remote
- Im Befehl âgit fsckâ wurde die Möglichkeit implementiert, BeschĂ€digungen, die Ăbereinstimmung von PrĂŒfziffern und die Korrektheit der Werte in den VerfĂŒgbarkeits-Bitkarten und RĂŒckwĂ€rtsindizes zu ĂŒberprĂŒfen.
- Im Befehl âgit clone âlocalâ wurde eine Fehlermeldung implementiert, die beim Versuch, aus einem Repository mit symbolischen Links innerhalb von $GIT_DIR zu kopieren, ausgegeben wird.
Quelle: opennet.ru


