adminslog/dokus/git/git-submodule-leitfaden.md

6.2 KiB
Raw Permalink Blame History

Git-Submodule: Der umfassende Praxisleitfaden

Inhalt


🔰 Was ist ein Git-Submodul?

Ein Submodul ist ein Git-Repository innerhalb eines anderen Git-Repositories. Es erlaubt, einen festen Commit eines externen Repositories als Teilprojekt einzubinden, ohne dessen Dateien direkt zu übernehmen.

Beispielhafte Struktur:

hauptprojekt/
├── .gitmodules
├── modul1/         ← eingebundenes Submodul
└── modul2/

🧱 Grundlagen

📌 .gitmodules

Diese Datei beschreibt Pfad und Remote-URL aller eingebundenen Submodule:

[submodule "modul1"]
  path = modul1
  url = git@github.com:user/modul1.git

🧠 Merksatz

Submodule sind Pointer auf einen bestimmten Commit eines anderen Repositories.

🛠️ Submodul hinzufügen

git submodule add <repo-url> <zielpfad>
git commit -m "📦 Submodul hinzugefügt"

Beispiel:

git submodule add git@github.com:user/libmath.git extern/libmath

Erzeugt:

  • .gitmodules
  • Verzeichniseintrag im Git-Index
  • Initialer Checkout des Submoduls (HEAD auf Remote-Commit)

🔄 Submodule aktualisieren

cd extern/libmath
git pull origin main
cd ../..
git add extern/libmath
git commit -m "🔄 Submodul libmath aktualisiert"

Nur das Hauptrepo speichert den Commit-Zeiger, nicht den Submodul-Inhalt selbst.

📥 Klonen mit Submodulen

Methode 1: Inklusive Submodule

git clone --recurse-submodules <url>

Methode 2: Nachträglich initialisieren

git clone <url>
git submodule update --init

🔃 Submodul-Synchronisation

Wenn sich .gitmodules ändert (z.B. Remote-URL):

git submodule sync

📂 Weitere Remotes im Submodul

cd modul1
git remote add backup git@backup.server:repo.git

Diese Remotes sind lokal, nicht versioniert. .gitmodules kennt nur den Haupt-Remote.

Stolperfallen und Besonderheiten

Problem Erklärung
Submodul wird nicht mitgeclont --recurse-submodules vergessen
Änderungen im Submodul nicht sichtbar Submodul-Commit im Hauptrepo nicht geupdated
.gitmodules zeigt nicht funktionierende URL z.B. lokale URL nach GitHub-Push muss angepasst werden
Submodul zeigt „detached HEAD“ normaler Zustand, wenn Submodul auf festen Commit gesetzt ist

🔄 Remote-URL wechseln

# In .gitmodules ändern oder per Befehl:
git config -f .gitmodules submodule.modul1.url git@github.com:newuser/libmath.git
git submodule sync

🚀 Push & Pull Verhalten

Aktion Wirkung
git push im Hauptrepo Pusht nur Zeiger auf Submodul-Commit
git push im Submodul Muss separat erfolgen
git pull im Hauptrepo Holt nicht automatisch neuen Submodul-Stand

🧼 Submodul löschen

# Schritt 1: Entfernen
git submodule deinit -f pfad/zum/modul
git rm -f pfad/zum/modul
rm -rf .git/modules/pfad/zum/modul
git commit -m "❌ Submodul entfernt"

🧰 Best Practices

  • Nur stabile Submodul-Commits einchecken, keine laufenden Branches.
  • Submodule niemals blind aktualisieren Änderungen genau prüfen.
  • Remote-Umschaltung dokumentieren oder automatisieren, z.B. per Script.
  • Submodule klein halten große, tief verschachtelte Strukturen vermeiden.
  • Für wiederverwendbare Bibliotheken oder Assets ideal (CAD, Snippets, Markdown, etc.).

📎 Nützliche Kommandos

git submodule status              # Überblick über alle Submodule
git submodule update --init      # Submodule initial holen
git submodule update --remote    # Auf neuesten Remote-Stand updaten
git config -f .gitmodules ...    # .gitmodules direkt bearbeiten

📑 Beispiel .gitmodules mit kommentierter Remote-Auswahl

[submodule "modul1"]
  path = modul1
  url = ssh://git@local.example.com:2222/myorg/modul1.git
  # url = git@github.com:myorg/modul1.git

🧭 Alternative: Subtree statt Submodul?

Subtree ist einfacher zu verwalten, aber:

  • kein fester Commit-Zeiger,
  • kein Remote-Wechsel ohne Umweg,
  • gemergte Historie im Hauptrepo.

Submodul = getrennte Repos
Subtree = eingemergter Inhalt

📚 Fazit

Git-Submodule sind mächtig, aber erfordern Disziplin und Überblick. Für wiederverwendbare Komponenten, zentral gepflegte Inhalte oder externe Bibliotheken sind sie oft die bessere Wahl als Duplikate oder Copy-Paste.