Die Version 2.37 des verteilten Systems zur Verwaltung von Quelltexten Git wurde vorgestellt. Git ist eines der beliebtesten, zuverlässigsten und leistungsstärksten Versionskontrollsysteme, das flexible Mittel für nichtlineare Entwicklungen bietet, die auf Branching und Merging basieren. Um die Integrität der Historie zu gewährleisten und Änderungen „rückblickend“ zu vermeiden, wird ein implizites Hashing der gesamten vorhergehenden Historie in jedem Commit verwendet; zudem ist die Authentifizierung durch digitale Signaturen für einzelne Tags und Commits der Entwickler möglich.
Im Vergleich zur vorherigen Version wurden 395 Änderungen in die neue Version aufgenommen, die mit Beteiligung von 75 Entwicklern vorbereitet wurden, von denen 20 erstmals an der Entwicklung teilgenommen haben. Die wesentlichen Neuerungen sind:
- Ein Mechanismus für partielle Indizes (sparse index), der lediglich einen Teil des Repositories abdeckt, wurde für die allgemeine Nutzung bereitgestellt. Partielle Indizes ermöglichen eine höhere Leistung und sparen Platz in Repositories, in denen partielle Klonvorgänge (sparse-checkout) durchgeführt werden oder mit einer unvollständigen Kopie des Repositories gearbeitet wird. In der neuen Version wurde die Integration partielle Indizes in die Befehle „git show“, „git sparse-checkout“ und „git stash“ abgeschlossen. Der auffälligste Leistungsvorteil durch die Verwendung von partiellen Indizes zeigt sich im Befehl „git stash“, dessen Ausführungsgeschwindigkeit in bestimmten Situationen um 80 % gestiegen ist.
- Ein neuer Mechanismus "cruft packs" wurde implementiert, um unerreichbare Objekte (unreachable) zu verpacken, auf die im Repository keine Links bestehen (weder von Branches noch von Tags). Unerreichbare Objekte werden vom Garbage Collector entfernt, verbleiben jedoch eine gewisse Zeit im Repository, um Wettlaufbedingungen auszuschließen. Zum Nachverfolgen des Zeitraums, in dem sich unerreichbare Objekte befinden, ist es notwendig, ihnen Labels mit den Änderungszeiten solcher Objekte zuzuordnen, was es nicht erlaubt, sie in einer einzigen Pack-Datei zu speichern, in der alle Objekte die gleiche Änderungszeit haben. Das zuvor angewandte Speichern jedes Objekts in einer separaten Datei führte zu Problemen bei einer großen Anzahl neuer unerreichbarer Objekte, die noch nicht zur Löschung anstehen. Der vorgeschlagene Mechanismus "cruft packs" ermöglicht es, alle unerreichbaren Objekte in einer einzigen Pack-Datei zu speichern, während die Daten zur Modifikationszeit jedes Objekts in einer separaten Tabelle erfasst werden, die in einer Datei mit der Endung ".mtimes" gespeichert wird.
- Für Windows und macOS wurde ein integrierter Mechanismus zur Überwachung von Änderungen im Dateisystem implementiert, der es ermöglicht, auf eine Durchsuchung des gesamten Arbeitsverzeichnisses bei der Ausführung von Operationen wie "git status" zu verzichten. Zuvor konnten externe Änderungen-Überwachungstools wie Watchman über Hooks zur Überwachung von Änderungen im Dateisystem verwendet werden, was jedoch die Installation zusätzlicher Programme und Einstellungen erforderte. Jetzt ist diese Funktionalität integriert und kann mit dem Befehl "git config core.fsmonitor true" aktiviert werden.
- Im Befehl "git sparse-checkout" wurde die Unterstützung für den alternativen "—cone"-Modus zur Bestimmung der Muster für das partielle Klonen als veraltet erklärt, der es ermöglichte, beim Definieren des klonbaren Teils des Repositories einzelne Dateien unter Verwendung der Syntax von " .gitignore" aufzulisten, was die Verwendung partieller Indizes zur Optimierung nicht zulässt.
- Die Flexibilität der fsync()-Aufrufkonfiguration zum Speichern von Änderungen auf der Festplatte wurde erhöht. In den Parameter „core.fsyncMethod“ wurde die Unterstützung der Synchronisierungsstrategie „batch“ hinzugefügt, die die Leistung beim Schreiben einer großen Anzahl einzelner Dateien verbessert, indem Änderungen im Schreibcache gesammelt werden, die durch einen einzigen fsync()-Aufruf ausgelöst werden. Der durchgeführte Test, bei dem 500 Dateien mit dem Befehl „git add“ hinzugefügt wurden, wurde im neuen Modus in 0,15 Sekunden abgeschlossen, während beim Aufruf von fsync() für jede Datei 1,88 Sekunden erforderlich waren und ohne Verwendung von fsync 0,06 Sekunden.
- Den Befehlen zur Durchlaufen von Branches, wie „git log“ und „git rev-list“, wurde die Option „—since-as-filter=X“ hinzugefügt, mit der Informationen über Commits herausgefiltert werden können, deren Erstellungszeit älter ist als „X“. Im Gegensatz zur Option „—since“ wird der neue Befehl als Filter implementiert, der die Durchlaufung nach dem ersten Commit, der älter als die angegebene Zeit ist, nicht stoppt.
- Im Befehl „git remote“ wird bei Angabe des Flags „-v“ die Ausgabe von Informationen über partielle Klone des Repositories bereitgestellt.
- Die Einstellung „transfer.credentialsInUrl“ wurde hinzugefügt, die die Werte „warn“, „die“ und „allow“ annehmen kann. Wenn im Parameter „remote.<name>.url“ Anmeldeinformationen im Klartext angegeben werden, wird der Versuch, die Operationen „fetch“ oder „push“ auszuführen, mit einem Fehler abgebrochen, wenn die Einstellung „transfer.credentialsInUrl“ auf „die“ gesetzt ist, oder mit einer Warnung, wenn der Wert „warn“ festgelegt ist.
- Standardmäßig wird eine neue Implementierung des interaktiven Modus des Befehls „git add -i“ verwendet, die von Perl nach C umgeschrieben wurde.
Quelle: opennet.ru
