63 lines
1.9 KiB
Markdown
63 lines
1.9 KiB
Markdown
# fix-submodule-branches-prod.sh
|
|
|
|
Bash-Script zum rekursiven Prüfen von Git-Submodulen und Umschalten von `detached HEAD` auf den passenden Branch.
|
|
|
|
## Verhalten
|
|
|
|
Für jedes Submodul gilt:
|
|
|
|
1. Wenn in `.gitmodules` ein `branch` konfiguriert ist, wird **dieser** verwendet.
|
|
2. Wenn **kein** `branch` konfiguriert ist, wird der **Default-Branch von `origin`** verwendet.
|
|
3. Standardmäßig wird **nur bei `detached HEAD`** umgeschaltet.
|
|
4. Optional kann mit `--force-switch` auch von einem anderen Branch auf den Ziel-Branch gewechselt werden.
|
|
5. Submodule mit **uncommitted changes** werden aus Sicherheitsgründen **übersprungen**.
|
|
6. Verschachtelte Submodule werden rekursiv verarbeitet.
|
|
|
|
## Voraussetzungen
|
|
|
|
- Bash
|
|
- Git
|
|
|
|
## Nutzung
|
|
|
|
```bash
|
|
chmod +x fix-submodule-branches-prod.sh
|
|
./fix-submodule-branches-prod.sh [optionen] [root-dir]
|
|
```
|
|
|
|
## Optionen
|
|
|
|
- `-n`, `--dry-run`
|
|
Zeigt nur an, was ausgeführt würde.
|
|
|
|
- `--force-switch`
|
|
Wechselt auch dann auf den Ziel-Branch, wenn das Submodul bereits auf einem anderen Branch steht.
|
|
|
|
- `--init-missing`
|
|
Initialisiert fehlende/nicht initialisierte Submodule automatisch.
|
|
|
|
- `-h`, `--help`
|
|
Zeigt die Hilfe an.
|
|
|
|
## Beispiele
|
|
|
|
```bash
|
|
./fix-submodule-branches-prod.sh --dry-run /pfad/zum/repo-root
|
|
./fix-submodule-branches-prod.sh --init-missing /pfad/zum/repo-root
|
|
./fix-submodule-branches-prod.sh --init-missing --force-switch /pfad/zum/repo-root
|
|
```
|
|
|
|
## Ausgabe
|
|
|
|
Am Ende wird eine Zusammenfassung ausgegeben, z. B.:
|
|
|
|
- Anzahl geprüfter Repositories mit `.gitmodules`
|
|
- Anzahl gefundener Submodule
|
|
- Anzahl gefixter `detached HEAD`/Branch-Wechsel
|
|
- Anzahl bereits korrekter Branches
|
|
- Anzahl übersprungener dirty Submodule
|
|
- Anzahl übersprungener Fälle/Fehler
|
|
|
|
## Sicherheitsverhalten
|
|
|
|
Das Script überspringt Submodule mit lokalen Änderungen (`git status --porcelain` nicht leer), damit keine uncommitted Änderungen durch Branch-Wechsel gefährdet werden. |