Versionsverwaltung: Git 2.38 kuratiert große Repositories mit Scalar

Git glänzt neuerdings mit einem eingebauten Verwaltungstool: Scalar soll durch einheitliche Features Probleme beim Managen besonders großer Repositories lösen.

Lesezeit: 4 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 9 Beiträge

(Bild: Den Rise/Shutterstock.com)

Von
  • Silke Hahn
Inhaltsverzeichnis

Die Quellcode-Versionsverwaltung Git ist in Version 2.38 erschienen. Das Highlight dürfte diesmal Scalar sein, ein neues Tool für Repositories. Scalar soll laut Herausgebern die bekanntesten Probleme anpacken, die beim Verwalten besonders großer Repositories regelmäßig auftauchen.

So kuratiert und konfiguriert es ein Featureset mit eingebautem Dateisystem-Monitor, Multipack-Index, Diagrammen zu geleisteten und erhaltenen Commits und einen Überblick geplanter Wartungsarbeiten. Zudem bietet Scalar Möglichkeiten zu gezieltem, auch partiellem Klonen und soll mit einer neuen Technik namens Sparse Checkout (zu deutsch etwa "Auschecken im Sparmodus") große Monorepos in der Handhabung kleiner erscheinen lassen.

Mit Scalar lassen sich Repositories relativ einfach klonen durch folgenden Befehl: $ scalar clone /path/to/repo. Auch das Klonen ganzer Repositories ist durch die Option --full-clone damit möglich. Um die für Scalar empfohlene Standardkonfiguration auf einen schon vorhandenen Klon anzuwenden, genügt der folgende Code:

$ cd /path/to/repo
$ scalar register

Eine weitere Neuerung betrifft das Verwalten mehrerer Zweige, die gemeinsam ein größeres Feature begründen. Beim Bearbeiten großer Features kann es hilfreich sein, die Arbeit auf mehrere separate Zweige herunterzubrechen, die jeweils aufeinander aufbauen. Sobald Developer jedoch frühere Zweige bearbeiten, kann das Verwalten der Versionsgeschichte für ein git rebasemühsam werden. Dafür bietet Git 2.38 eine Option namens --update-refs.

Aktualisieren der Referenzen bei einem Git-Rebase: Git 2.38 führt --update-refs ein.

(Bild: GitHub)

Wer regelmäßig das Rebase so durchführen will, kann durch die Konfiguration git config --global rebase.updateRefs true Git dazu anweisen, die Option --update-refs automatisch zu verwenden.

Die Idee des Sparmodus zum Verringern der Repositorygröße ist nicht neu, hierzu hatten Git-Entwickler Anfang 2020 bereits einen längeren Blogpost mit Anleitungen und Erklärungen hinterlegt ("Bring your monorepo down to size"). Darin ist auch das nun in Scalar eingebettete kegelförmige Pattern zur Performancesteigerung im Sparmodus beschrieben. Damals liefen die Arbeiten an der Entwicklung eines sparse-checkout-Befehls noch und es war mehr Handarbeit nötig als mittlerweile. Der Trick beim Sparmodus besteht wohl darin, dass Git damit weniger einzelne Dateien inspizieren muss, wenn Entwickler Befehle wie git add, git status oder git checkout ausführen.

Ein Cone Mode soll dem Feature weiteres Skalieren für besonders große Repositories ermöglichen. Dafür kommen Techniken des Pattern-Matching zur Anwendung, die der Logik von .gitignore folgen. Die Dateien listen Muster auf. Beginnt eine Zeile mit !, werden die Pfade, die diesem Muster entsprechen, von der weiteren Auswertung ausgeklammert. Damit lässt sich der Vorgang des Abgleichens beschleunigen, da nur mehr Ordner mit Patterns ohne das Rufzeichen zu matchen sind. Allerdings kann das in der Praxis wohl recht komplex werden, wenn es um das Spezifizieren komplizierter Patterns geht. Große Repositories benötigen möglicherweise Tausende von Patterns, um ein Arbeitsverzeichnis zu beschreiben, und die Überprüfung jedes Musters mit Millionen von Pfaden würde zu Milliarden von Musterprüfungen bei jedem Git-Checkout-Befehl führen. Das kann sehr lange dauern.

Git-Versionsverwaltung mit Scalar: Prinzip des Scarse Mode beim Checkout, der nun eingebettet ist in das neue Verwaltungstool

(Bild: GitHub)

Die meisten Git-Nutzer können stattdessen auf einen einfacheren Mechanismus zurückgreifen, indem sie lediglich Einschränkungen berücksichtigen, die auf dem Matchen der Dateiordner-Präfixe beruhen. Die Sparse-Checkout-Datei kann dann danach vorgehen, ob ein Muster rekursiv ist oder ein Parent Pattern, was den Ablauf beschleunigt. Git erzeugt beim Parsen der Patterns nämlich zwei unterschiedliche Hashsets für rekursive und Eltern-Pfade. Rekursive Datensätze werden dadurch automatisch ihren Eltern-Pfaden zugeschlagen. Eine detaillierte Erläuterung zum zugrundeliegenden Code findet sich auf GitHub. Im Blogeintrag steht eine Anleitung zum Klonen von Repositories im Sparse-Modus. Die Konfigurationsmöglichkeiten befinden sich laut Entwicklerteam zurzeit noch im experimentellen Status.

Zeitlich fiel das aktuelle Release mit dem von Google ausgerichteteten Summer of Code zusammen, an dem Git teilnahm. Das Projekt betreuten in diesem Rahmen zwei Studierende, die sich mit Sparse-Index-Integration und Erreichbarkeits-Bitmaps befassten. Ihre Arbeiten sind in Git 2.38 eingeflossen, wie sich im Detail im Blogpost-Abschnitt "Tidbits" nachlesen lässt.

Interessierte finden eine vollständige Liste der Änderungen in den Release Notes auf GitHub. Ergänzend ist eine Ankündigung im GitHub-Blog erschienen, die die wesentlichen Änderungen ausführlich vorstellt.

(sih)