Die neue Version des verteilten Quelltextverwaltungssystems Git 2.37 wurde veröffentlicht. Git ist eines der beliebtesten, zuverlässigsten und leistungsstärksten Versionskontrollsysteme, das flexible non-lineare Entwicklungswerkzeuge bietet, die auf Branching und Merging basieren. Um die Integrität der Geschichte und die Resistenz gegen nachträgliche Änderungen zu gewährleisten, wird eine implizite Hash-Berechnung der gesamten vorherigen Geschichte in jedem Commit verwendet. Zudem ist es möglich, Entwickler durch digitale Signaturen bestimmter Tags und Commits zu authentifizieren.
Im Vergleich zur vorherigen Version wurden in die neue Version 395 Änderungen aufgenommen, die von 75 Entwicklern vorbereitet wurden, von denen 20 zum ersten Mal an der Entwicklung teilgenommen haben. Die wichtigsten Neuerungen sind:
- Der Mechanismus der partiellen Indizes (sparse index) wurde zur allgemeinen Verwendung bereitgestellt und umfasst nur Teile des Repositories. Partielle Indizes ermöglichen eine Leistungssteigerung und Platzersparnis in Repositories, in denen partielle Klonoperationen (sparse-checkout) durchgeführt werden oder mit einer unvollständigen Kopie des Repositories gearbeitet wird. In dieser neuen Version wurde die Integration der partiellen Indizes in die Befehle „git show“, „git sparse-checkout“ und „git stash“ abgeschlossen. Der auffälligste Leistungsgewinn durch die Verwendung partieller Indizes ist beim Befehl „git stash“ zu beobachten, dessen Ausführungsgeschwindigkeit in bestimmten Situationen um bis zu 80 % gestiegen ist.
- Ein neuer Mechanismus für "cruft packs" wurde implementiert, um unerreichbare Objekte zu verpacken, auf die im Repository keine Verweise bestehen (weder von Branches noch von Tags). Unerreichbare Objekte werden vom Garbage Collector entfernt, verbleiben aber bis zur Löschung einige Zeit im Repository, um Zustandsrennen auszuschließen. Zum Nachverfolgen der Verweildauer unerreichbarer Objekte ist es notwendig, diese mit Zeitstempeln zu versehen, was jedoch eine Speicherung in einer einzelnen Pack-Datei, in der alle Objekte einen gemeinsamen Änderungszeitpunkt haben, nicht ermöglicht. Die zuvor verwendete Speicherung jedes Objekts in einer separaten Datei führte zu Problemen, wenn eine große Anzahl neuer unerreichbarer Objekte vorhanden war, die noch nicht zur Löschung fällig waren. Der vorgeschlagene Mechanismus "cruft packs" ermöglicht es, alle unerreichbaren Objekte in einer einzigen Pack-Datei zu speichern, während die Änderungsdaten jedes Objekts in einer separaten Tabelle festgehalten 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. Dieser ermöglicht es, beim Ausführen von Operationen wie „git status“ auf eine vollständige Durchsuchung des Arbeitsverzeichnisses zu verzichten. Zuvor konnten externe Überwachungswerkzeuge, wie Watchman, zur Überwachung von Änderungen über Hooks verwendet werden, was jedoch die Installation zusätzlicher Programme sowie deren Konfiguration erforderte. Nun 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 des alternativen Modus „—cone“ für die Musterdefinition beim partiellen Klonen als veraltet erklärt. Dadurch ist es möglich, beim Definieren des zum Klonen vorgesehenen Teils eines Repositories einzelne Dateien mit der Syntax „.gitignore“ aufzulisten, was die Nutzung partieller Indizes nicht optimiert.
- Die Flexibilität bei der Konfiguration des Aufrufs von fsync() zum Zurückschreiben von Änderungen auf die Festplatte wurde erhöht. Der Parameter „core.fsyncMethod“ unterstützt nun die Synchronisationsstrategie „batch“, die die Leistung beim Schreiben einer großen Anzahl separater Dateien verbessert, indem Änderungen im Schreibcache gesammelt und mit einem einzigen Aufruf von fsync() zurückgeschrieben werden. Ein durchgeführter Test, bei dem mit dem Befehl „git add“ 500 Dateien hinzugefügt wurden, wurde im neuen Modus in 0,15 Sekunden abgeschlossen, während der Aufruf von fsync() für jede Datei 1,88 Sekunden benötigte und ohne fsync 0,06 Sekunden benötigte.
- Den Branch-Iterationsbefehlen wie „git log“ und „git rev-list“ wurde die Option „—since-as-filter=X“ hinzugefügt, mit der Informationen zu Commits, deren Erstellungszeitpunkt älter als „X“ ist, herausgefiltert werden können. Im Gegensatz zur Option „—since“ wird das neue Kommando als Filter implementiert, der die Iteration nicht nach dem ersten Commit stoppt, der älter als die angegebene Zeit ist.
- Im Befehl „git remote“ wird beim Angeben des Flags „-v“ die Ausgabe von Informationen über partielle Klone des Repositories ermöglicht.
- Die Einstellung „transfer.credentialsInUrl“ wurde hinzugefügt. Sie kann die Werte „warn“, „die“ und „allow“ annehmen. Wenn im Parameter „remote.<name>.url“ Anmeldedaten im Klartext angegeben werden, wird der Versuch, die Operationen „fetch“ oder „push“ durchzuführen, mit einem Fehler beendet, wenn die Einstellung „transfer.credentialsInUrl“ den Wert „die“ hat, oder mit einer Warnung, wenn der Wert „warn“ eingestellt ist.
- Standardmäßig ist eine neue Implementierung des interaktiven Modus des Befehls „git add -i“ aktiv, die von Perl nach C umgeschrieben wurde.
Quelle: opennet.ru
