.gitignore und Git-Submodule: Dateien ausschließen und Projekte einbinden
Kurz: Die Datei .gitignore legt fest, was Git nicht versioniert; Submodule binden ein anderes Repository in einem festen Stand in das eigene ein.
Genauer: Nicht alles in einem Projektordner gehört in die Versionsverwaltung: erzeugte Dateien, Abhängigkeiten, Geheimnisse. Und manchmal braucht man fremden oder gemeinsamen Code, ohne ihn zu kopieren.
Im Detail
.gitignore
In .gitignore stehen Muster für Dateien, die Git übergehen soll:
node_modules/
dist/
*.log
.env
.DS_Store
!wichtig.log # Ausnahme mit !
/build # nur im Hauptordner
Kommentare beginnen mit #. Eine .gitignore gilt nur für noch nicht verfolgte Dateien. Wurde etwas schon eingecheckt, bleibt es verfolgt, bis man es mit git rm --cached datei aus dem Index nimmt. Ordner-spezifische Dateien können in Unterordnern liegen, globale Regeln stehen in ~/.config/git/ignore. Vorlagen für viele Sprachen bietet gitignore.io und das Repository github/gitignore.
Geheimnisse
Passwörter, API-Schlüssel und .env-Dateien gehören nie in das Repository. Einmal eingecheckt, bleibt ein Geheimnis im Verlauf und muss als kompromittiert gelten: Schlüssel sofort widerrufen und erneuern, das Entfernen aus der Historie (git filter-repo) ist aufwendig. Lege besser eine .env.example ohne Werte ab.
Submodule
Ein Submodul ist ein Verweis auf einen bestimmten Commit eines anderen Repositories:
git submodule add https://github.com/firma/bibliothek libs/bibliothek
git clone --recurse-submodules <url> # mit Submodulen klonen
git submodule update --init --recursive # nachträglich laden
git submodule update --remote # auf neueren Stand heben
Die Datei .gitmodules hält Pfad und Adresse. Das Hauptprojekt merkt sich den genauen Commit, sodass alle denselben Stand nutzen.
Wann Submodule, wann Alternativen
Submodule sind brauchbar, aber fehleranfällig: Man vergisst, sie zu aktualisieren, oder pusht Änderungen nur im Hauptprojekt. Oft sind Paketmanager (npm, pip, Maven) oder ein Monorepo einfacher. Eine Variante sind Subtrees (git subtree), die den Code kopieren statt zu verweisen.
Siehe auch: Git, Umgebungsvariablen, Monorepo, API-Keys