Vorstellung Release des verteilten Versionskontrollsystems Git 2.55. Unter den wichtigsten Änderungen: standardmäßig Integration von Rust, Implementierung des fsmonitor-Prozesses für Linux, neue Strategie zur Neuverpackung des inkrementellen MIDX-Index, git history fixup-Befehl zur Behebung von Commits, Optimierung der Generierung von Objektverfügbarkeitskarten, Unterstützung der parallelen Ausführung von Hooks, git format-rev-Befehl. Git-Code wird verbreitet unter der GPLv2+-Lizenz.

Im Vergleich zur vorherigen Version wurden 505 Änderungen in die neue Version aufgenommen, die mit Beteiligung von 100 Entwicklern vorbereitet wurden, darunter 33, die zum ersten Mal an der Entwicklung von Git teilgenommen haben.

Die wichtigsten Neuerungen (github.blog, gitlab.com/blog, gitlab.com/git-scm):

  • Standardmäßig eingeschlossen Unterstützung von Komponenten in Rust. Der Compiler rustc wurde hinzugefügt gehört zu den Build-Abhängigkeiten. Für einen Build ohne Rust kann das Flag NO_RUST=1 beim Ausführen des Make-Tools oder -Drust=disabled beim Ausführen der Meson-Konfiguration verwendet werden. Die Möglichkeit, den Build mit Rust zu deaktivieren, wird bis zu der Git-Version 3.0 unterstützt, in der Rust ein neuer Display-Engine (DC) für AMD APU der Serie HD 7000 (Sea Islands, GCN 1.1) hinzugefügt. zu den obligatorischen Abhängigkeiten hinzugefügt wird. In Rust wurde eine Schicht für die Portabilität zwischen Konfigurationen mit SHA-1- und SHA-256-Hashes implementiert, sowie einige interne Funktionen, wie das Kodieren und Dekodieren von Ganzzahlen variabler Länge. Für die Zukunft wird eine Neugestaltung weiterer bedeutender interner Komponenten von Git in Rust erwartet.
  • Im experimentellen Befehl "git history", der Möglichkeiten zur Umschreibung der Änderungshistorie bietet, wurde die Operation „git history fixup“ zur Behebung von Commits hinzugefügt. Die fixup-Operation ermöglicht es, Änderungen, die über git add hinzugefügt wurden, in einen früheren Commit zu verschieben und automatisch alle nachfolgenden Commits entsprechend umzuschreiben, ähnlich wie bei der Ausführung des Befehls git commit —fixup= und dem Start von git rebase —autosquash ~.
  • Für die Linux-Plattform wurde ein Hintergrundprozess fsmonitor, implementiert, der Änderungen im Dateisystem über den Mechanismus inotify verfolgt und es ermöglicht, bei Ausführung von Befehlen wie git status ohne das Durchsuchen des gesamten Arbeitsverzeichnisses auszukommen. Die Aktivierung erfolgt über die Einstellung „core.fsmonitor».
  • Im Befehl git repack wurde der Modus —write-midx=incremental hinzugefügt, der eine neue Strategie zur Aktualisierung von Metadaten im inkrementellen MIDX-Index (Multi-Pack-Index) implementiert, die es ermöglicht, ohne eine vollständige Neuverpackung des gesamten Index auszukommen. Im inkrementellen Multi-Pack-Index wird anstelle eines großen Index, der Informationen über die Verteilung von Objekten auf Pack-Dateien enthält, eine Schichtung eingeführt – jede Schicht umfasst eine bestimmte Anzahl von Pack-Dateien und wird in einer separaten Bitmap-Datei gespeichert. Eine solche Struktur ermöglicht es, Daten über Objekte in neuen Pack-Dateien in den Index aufzunehmen, indem neue Schichten ohne eine Rekonstruktion der bereits vorhandenen Schichten angehängt werden. Der Befehl git repack —write-midx=incremental ermöglicht das Hinzufügen einer neuen Schicht zum inkrementellen MIDX-Index, die kürzlich erstellte Pack-Dateien umfasst. In Kombination mit dem Repository-Packing-Modus —geometric bietet der neue Befehl die Möglichkeit, neue Objekte aus mehreren Pack-Dateien in einer größeren Pack-Datei zusammenzufassen und bei Bedarf das Packen und Zusammenführen mehrerer benachbarter Schichten des inkrementellen MIDX-Index durchzuführen. Eine solche Strategie ermöglicht es, beim Ausführen von git repack nur die oberen Schichten neu zu schreiben und die alten großen Schichten unberührt zu lassen, sowie ein unkontrolliertes Wachstum der Schichtungskette zu vermeiden, während die Gesamtzahl der Schichten auf einem logarithmischen Niveau im Verhältnis zur Gesamtzahl der Objekte gehalten wird.
  • Die Generierung von Bitmaps zur Verfügbarkeit von Objekten wurde durch einen neuen Algorithmus zur Durchquerung des Objektbaums erheblich optimiert, der überflüssige Rekursionen vermeidet, Positionen von Objekten zwischenspeichert, Bitmaps vor ihrer Verknüpfung durch XOR sortiert und den Code zur Erstellung von Pseudomerges-Bitmaps überarbeitet (pseudo-merge). In einem Test-Repository haben die Optimierungen die Generierungszeit von Bitmaps von 612 auf 294 Sekunden reduziert.
  • Die Möglichkeit zur parallelen Ausführung von unabhängigen Hooks In den Konfigurationsdateien. Hooks, die den gemeinsamen Zustand beeinflussen oder berücksichtigen, wie das Ändern von Commit-Kommentaren oder das Inspizieren von Indizes und Arbeitsverzeichnissen, können nicht parallel ausgeführt werden. Gleichzeitig können jedoch Hooks zur Überprüfung durch den Linter und zur Ausführung von Unit-Tests parallel gestartet werden. Parallel ausführbare Hooks werden über den Parameter hook.name_huk.parallel = true konfiguriert. Die Anzahl gleichzeitig ausgeführter Jobs wird über die Einstellung hook.jobs, hook..jobs oder die Befehlszeilenoption -j bestimmt.
  • Im Befehl git pack-objects wurde die Möglichkeit implementiert, Filter wie blob:none, blob:limit=, tree:0, object:type=, sparse: und combine:. In einem durchgeführten Test ermöglichte die Ausklammerung von Blobs bei der Ausführung von —path-walk eine Reduzierung der Größe der erstellten Pack-Datei um 16%.
  • Das Kommando git format-rev wurde hinzugefügt, um Revisionen und Objektnamen zu formatieren, die in Commit-Listen erwähnt oder in beliebigem Text (z.B. in Hooks zur Verarbeitung von Commit-Kommentaren) vorkommen.

git last-modified | git format-rev —stdin-mode=text —format=%an

Junio C Hamano builtin/commit.c

  • Standardmäßig wird das Escaping der meisten Steuersequenzen des Terminals in Informationsnachrichten und Fehlermeldungen, die vom Server übermittelt werden, aktiviert. Bei einem Aufruf eines böswilligen Servers konnten solche Escape-Sequenzen verwendet werden, um Ausgaben zu verbergen oder zu modifizieren, z.B. durch Escape-Sequenzen zum Bewegen des Cursors und zum Löschen von Text. Die Unterstützung von Escape-Sequenzen zur farblichen Hervorhebung von Elementen wurde beibehalten.
  • Der Befehl git checkout -m speichert jetzt automatisch konfliktträchtige lokale Änderungen im Stash-Bereich, ohne dass der Konflikt sofort gelöst werden muss.
  • Der Befehl git push hat die Möglichkeit hinzugefügt, einen Branch in mehreren externen Git-Servern mit einem einzigen Befehl zu platzieren. Beispielsweise kann eine Gruppe publish aus den Servern github, gitlab und mirror erstellt werden, um den Branch main sowohl auf dem Hauptserver als auch auf Mirrors zu übertragen:

git config remotes.publish "github gitlab mirror"
git push publish main

  • Der Befehl git log —graph hat die Option —graph-lane-limit= hinzugefügt, um die Anzahl der vertikalen Linien bei der Visualisierung von Branches zu begrenzen, wodurch Platz auf dem Bildschirm für Commit-Daten in Repositories mit einer großen Anzahl von Branches geschaffen wird.


* | | | | 619931f561 Zusammenführen des Branches ‘dl/posix-unused-warning-clang’
|\ \ \ \ \
| * | | | ~ cf48887610 compat/posix.h: vereinfacht den GIT_GNUC_PREREQ() Vergleich
| * | | | ~ ffd45926dc compat/posix.h: bereinigt GIT_GNUC_PREREQ() und UNUSED
|\ \ \ \ \~
| * | | | ~ 3f5203eeb4 ls-files: filtert pathspec vor lstat

  • In die Befehle git log und git rev-list wurde die Option —max-count-oldest= hinzugefügt, die es ermöglicht, die N ältesten Commits im Bereich auszuwählen.

Quelle: linux.org.ru

60GB SSD 8Gb DDR4