Skip to content

Git Submodule und große Repositories

Einführung

Submodule betten ein Repo in ein anderes. Nützlich für fest versionierte Abhängigkeiten – riskant bei falscher Nutzung. Hier: Wann verwenden, Management, Alternativen.

Wann geeignet / ungeeignet

GeeignetUngeeignet
Version-Pinning gemeinsamer BibliothekHäufige, gekoppelte Änderungen
Externe, vendored DependencyBedarf atomarer Cross-Repo Commits
Rechtliche/Audit-IsolationTeam ungeübt mit Submodule-Fluss

Hinzufügen

bash
git submodule add https://github.com/vendor/lib-a external/lib-a
git commit -m "Add lib-a submodule"

.gitmodules entsteht.

.gitmodules Beispiel

[submodule "external/lib-a"]
  path = external/lib-a
  url = https://github.com/vendor/lib-a

Klonen mit Submodulen

bash
git clone https://github.com/org/app.git
cd app
git submodule update --init --recursive

Oder direkt:

bash
git clone --recurse-submodules <url>

Aktualisieren

bash
cd external/lib-a
git fetch
git checkout v2.4.0
cd ../..
git add external/lib-a
git commit -m "Bump lib-a to v2.4.0"

git diff --submodule liefert Kurzinfo.

Entfernen

bash
git submodule deinit -f external/lib-a
rm -rf .git/modules/external/lib-a
git rm -f external/lib-a
git commit -m "Remove lib-a submodule"

Stolpersteine

ProblemUrsacheLösung
Detached HEAD im SubmoduleFrischer CloneBranch anlegen vor Änderung
Pointer-Update vergessenNur im Submodule commitParent-Repo Pfad stage
VerschachtelungschaosRekursive Submodule--recursive oder Vereinfachung
.gitmodules KonflikteGleichzeitige EditsKoordination / Rebase früh

Alternativen für große Codebasen

StrategieBeschreibung
MonorepoEinheitliche Historie + Tooling
SubtreeCode einbetten, weniger Overhead
PaketmanagerPublizieren + Versionieren
Polyrepo + CI OrchestrationLose Kopplung, Pipelines verbinden

Subtree Kurz

bash
git subtree add --prefix=vendor/lib-a https://github.com/vendor/lib-a main --squash

Update:

bash
git subtree pull --prefix=vendor/lib-a https://github.com/vendor/lib-a main --squash

Performance-Tipps

  • Shallow Clone in CI: git clone --depth 20
  • Partial Clone (Git ≥2.19):
bash
git clone --filter=blob:none --sparse <url>
  • Sparse Checkout:
bash
git sparse-checkout init --cone
git sparse-checkout set src/ docs/

Status auditieren

bash
git submodule status --recursive

Sicherheit

  • Quellcode auditieren
  • Auf Tag/Commit pinnen (kein floating branch)
  • Supply-Chain Advisories verfolgen

Zusammenfassung

Submodule erzwingen explizites Version-Pinning, fügen aber Reibung hinzu. Bewusst einsetzen; für breitere Integration Subtree, Packages oder Monorepo evaluieren.

Nächste Schritte

  • Hooks & Automation
  • Team-Best-Practices

Key Commands

bash
git submodule add <url> <path>
git submodule update --init --recursive
git diff --submodule
git submodule status --recursive