Back

Verwendung von Git Subrepos zur Verwaltung großer Codebasen

Verwendung von Git Subrepos zur Verwaltung großer Codebasen

Wenn Ihr Frontend-Team Utility-Bibliotheken oder UI-Komponenten über mehrere Repositories hinweg teilt, stehen Sie vor einer grundlegenden Frage: Wie halten Sie diesen gemeinsam genutzten Code synchron, ohne Reibungsverluste im Workflow zu erzeugen? Git-Submodule existieren zwar, frustrieren Entwickler jedoch durch ihre Komplexität. Git-Subtree funktioniert, kann aber je nach Merge-Strategie die Historie so zusammenfassen, dass Upstream-Beiträge erschwert werden.

Hier bieten Drittanbieter-Tools wie git-subrepo einen alternativen Ansatz zur Verwaltung gemeinsam genutzten Codes in Git – einen Ansatz, der externe Repositories direkt in Ihre Codebasis einbettet und dabei auf eine sauberere Developer Experience abzielt.

Wichtigste Erkenntnisse

  • Git-Subrepo ist ein Drittanbieter-Tool – kein integriertes Git-Feature – das externe Repositories als reguläre Dateien einbettet und damit das Klonen und Onboarding im Vergleich zu Submodulen vereinfacht.
  • Es positioniert sich zwischen Submodulen (exaktes Commit-Pinning, komplexer Workflow) und Subtree (zusammengeführte Historie, konfigurierbare Beibehaltung) und bietet einen pragmatischen Mittelweg.
  • Das Tool eignet sich gut für gemeinsam genutzte interne Pakete, geforkte Abhängigkeiten und schrittweise Monorepo-Migrationen in großen Codebasen.
  • Die Einführung von git-subrepo bringt Kompromisse mit sich: CI-Tool-Installation, zusammengefasste Historie beim Pull und Abhängigkeit von Community-Wartung.

Was ist Git Subrepo (und was es nicht ist)

Git-Subrepo ist kein integriertes Git-Feature. Es handelt sich um ein von der Community gepflegtes Tool, das eine Alternative zu Git-Submodulen und Subtree-basierten Workflows für das Vendoring von Abhängigkeiten mit Git bietet. Das Tool klont ein externes Repository in ein Unterverzeichnis Ihres Projekts und verfolgt Metadaten in einer .gitrepo-Datei, anstatt eine spezielle Git-Konfiguration zu erfordern.

Anders als bei Submodulen müssen Mitwirkende nach dem Klonen keine zusätzlichen Befehle ausführen – der eingebettete Code existiert als reguläre Dateien in Ihrem Repository. Anders als Subtree, das je nach Verwendung die Upstream-Historie entweder beibehalten oder zusammenfassen kann, verfolgt git-subrepo die Upstream-Beziehung separat und fasst Upstream-Änderungen beim Pull standardmäßig typischerweise zusammen.

Git Subrepo vs. Submodule vs. Subtree

Das Verständnis der Kompromisse hilft Ihnen, den richtigen Ansatz für Ihr Team zu wählen.

AspektGit SubmoduleGit SubtreeGit Subrepo
IntegrationsmodellZeiger auf externen CommitIn Repository zusammengeführtAls reguläre Dateien geklont
Behandlung der HistorieSeparat, verlinktZusammengefasst oder beibehaltenTypischerweise beim Pull zusammengefasst, über Metadaten verfolgt
Clone-VerhaltenErfordert --recurse-submodulesFunktioniert normalFunktioniert normal
Upstream-SynchronisationManuelle Checkout-UpdatesSubtree pull/pushSubrepo pull/push
CI-ReproduzierbarkeitErfordert sorgfältige KonfigurationGenerell zuverlässigErfordert Tool-Installation

Submodule funktionieren gut, wenn Sie exaktes Commit-Pinning benötigen und Ihr Team den Workflow versteht. Teams sollten aktuelle Git-Versionen verwenden und das Klonen nicht vertrauenswürdiger Repositories mit rekursiver Submodul-Initialisierung vermeiden, da rekursive Muster historisch gesehen Sicherheitsbedenken aufgeworfen haben, wenn sie unvorsichtig verwendet wurden.

Subtree führt externen Code direkt zusammen, was das Klonen vereinfacht, aber das Beitragen von Änderungen zum Upstream komplexer machen kann. Die Historie kann je nach gewählter Strategie vollständig beibehalten oder zusammengefasst werden.

Git-Subrepo liegt zwischen diesen Ansätzen. Der git-subrepo-Workflow hält externen Code als normale Dateien, während die Upstream-Beziehung in Metadaten verfolgt wird. Dies vereinfacht das Onboarding, erfordert aber die Installation des Tools für Synchronisationsoperationen.

Wann Git Subrepo sinnvoll ist

Der git-subrepo-Workflow passt zu spezifischen Szenarien in großen Codebasen:

Gemeinsam genutzte interne Pakete: Wenn mehrere Anwendungen eine gemeinsame Komponentenbibliothek nutzen, ermöglicht git-subrepo jedem Team, die Bibliothek zu vendoren und gleichzeitig die Möglichkeit zu behalten, Fixes zum Upstream zu pushen.

Geforkte Abhängigkeiten: Wenn Sie eine gepatchte Version einer Open-Source-Bibliothek pflegen, verfolgt git-subrepo Ihre Fork-Beziehung ohne den Aufwand von Submodulen.

Schrittweise Monorepo-Migration: Teams, die zu einem Monorepo übergehen, können git-subrepo verwenden, um Repositories schrittweise zu konsolidieren.

Kompromisse, die Sie berücksichtigen sollten

Git-Subrepo ist nicht universell besser – es bringt seine eigene Komplexität mit sich:

Merge-Konflikte: Wenn sowohl Ihr Repository als auch der Upstream dieselben Dateien ändern, erfordert die Konfliktlösung das Verständnis beider Codebasen. Dies gilt für alle Einbettungsansätze, und git-subrepo eliminiert dies nicht.

Beibehaltung der Historie: Standardmäßig fasst git-subrepo Upstream-Commits beim Pull zusammen. Wenn Sie die vollständige Commit-Historie benötigen, könnte Subtree ohne Zusammenfassung besser geeignet sein.

CI-Überlegungen: Ihre Build-Pipeline benötigt git-subrepo installiert, um Synchronisationsoperationen auszuführen. Dies fügt eine Abhängigkeit hinzu, die Submodule und Subtrees vermeiden, da sie integrierte Git-Befehle verwenden.

Wartungsaufwand: Als Drittanbieter-Tool hängt git-subrepo von der Community-Wartung ab. Bewerten Sie, ob Ihr Team potenzielle Lücken im Support bewältigen kann und ob das Aktivitätsniveau des Projekts Ihren langfristigen Anforderungen entspricht.

Grundlegender Git-Subrepo-Workflow

Nach der Installation von git-subrepo sind die Kernbefehle unkompliziert:

# Clone an external repo into a subdirectory
git subrepo clone https://github.com/your-org/shared-utils packages/utils

# Pull upstream changes
git subrepo pull packages/utils

# Push local changes back upstream
git subrepo push packages/utils

Die .gitrepo-Datei in jedem Subrepo-Verzeichnis verfolgt die Upstream-URL, den Branch und den zuletzt synchronisierten Commit.

Fazit

Git-Subrepo bietet einen pragmatischen Mittelweg für die Verwaltung gemeinsam genutzten Codes in Git, wenn Submodule zu komplex erscheinen und Subtree-Workflows nicht zu Ihrem Beitragsmodell passen. Es funktioniert besonders gut für Frontend-Teams, die interne Pakete über Repositories hinweg vendoren.

Bevor Sie es einführen, bewerten Sie, ob Ihre CI-Pipeline die Tool-Abhängigkeit aufnehmen kann und ob die Synchronisationsmuster Ihres Teams den Ansatz gegenüber integrierten Alternativen rechtfertigen. Die richtige Wahl hängt von Ihren spezifischen Anforderungen hinsichtlich Beibehaltung der Historie, Upstream-Beiträgen und Developer-Onboarding ab.

FAQs

Ja. Da git-subrepo externen Code als reguläre Dateien einbettet, können Entwickler, die den Code nur lesen oder modifizieren müssen, normal arbeiten, ohne das Tool zu benötigen. Nur Teammitglieder, die Synchronisationsoperationen wie das Pullen von Upstream-Änderungen oder das Pushen lokaler Änderungen zurück durchführen, benötigen git-subrepo installiert.

Git-Subrepo verfolgt den zuletzt synchronisierten Commit in einer .gitrepo-Metadatendatei innerhalb des Unterverzeichnisses. Dies bietet eine Form des Versions-Pinnings, ist jedoch weniger explizit als Submodule, die einen exakten Commit-SHA im Baum des übergeordneten Repositories aufzeichnen. Sie kontrollieren, wann neue Upstream-Änderungen gepullt werden, sodass die gepinnte Version nur voranschreitet, wenn Sie git subrepo pull ausführen.

Es kann für das Vendoring geforkter oder gepatchter Open-Source-Bibliotheken funktionieren, bei denen Sie Upstream-Änderungen verfolgen und Modifikationen zurückpushen müssen. Für unmodifizierte Abhängigkeiten Dritter sind jedoch Paketmanager wie npm oder yarn im Allgemeinen geeigneter, da sie Versionierung, Lockfiles und Ökosystem-Tooling bieten, die git-subrepo nicht bereitstellt.

Der eingebettete Code bleibt in Ihrem Repository intakt, da er als reguläre Dateien existiert. Sie verlieren jedoch die Möglichkeit, zukünftige Updates zu pullen oder Änderungen zum Upstream zurückzupushen. Sie müssten die .gitrepo-Metadatendatei aktualisieren, um auf ein neues Remote zu verweisen, falls das Repository umzieht, oder einfach den vendorten Code als statischen Snapshot weiter verwenden.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay