git-sync-all: Technische Details
Aufbau von git-sync-all: Module, Ausführungsreihenfolge, Dry-Run-Wrapper, Subshell-Isolation, Lock-Datei, Dateistruktur, Tests und CI.
git-sync-all: Technische Details
Dateistruktur
git-sync-all/
├── bin/git-sync-all Einstiegspunkt
├── lib/
│ ├── core.sh Strict Mode, Logging, Farben, Lock, Cleanup
│ ├── config.sh Defaults, Config laden, Validierung, --init-config
│ ├── cli.sh Argumente, Hilfe, Version, Alias
│ ├── repo-discovery.sh Repository-Suche, Filter, Remote-Prüfung
│ ├── git-ops.sh Git-Operationen, Dry-Run-Wrapper
│ ├── sync.sh Sync-Ablauf, Rückfragen, Status, Zusammenfassung
│ ├── inventory.sh repos.yml, --verify, Aufräumen, --init-inventory
│ └── issues.sh GitHub-Issues über gh
├── config/
│ ├── config.conf.example
│ └── repos.yml.example
├── tests/ Test-Skripte
├── Makefile install, uninstall, link, test, lint, format
└── install.ps1 Windows-Installer
Ausführungsreihenfolge
graph TD
A[parse_args] --> B[load_config]
B --> C[apply_cli_overrides]
C --> D[setup_environment: Farben, git-Prüfung, Lock]
D --> E{Modus}
E -->|--verify| F[parse_inventory und verify_inventory]
E -->|--issues| G[parse_inventory und show_issues]
E -->|Standard| H[discover_repos]
H --> I{--status?}
I -->|ja| J[show_status]
I -->|nein| K[sync_all]
J --> L[print_summary]
K --> L
L --> M{Failed größer 0?}
M -->|ja| N[Exit 1]
M -->|nein| O[Exit 0]
--help, --version, --init-config, --setup-alias und --init-inventory beenden das Tool bereits in parse_args. Der Lock wird vor allen Modi erworben, also auch für --status, --verify und --issues.
Module
| Datei | Aufgabe |
|---|---|
bin/git-sync-all |
Löst den eigenen Pfad (auch über Symlinks) auf, lädt alle Bibliotheken und steuert main(). |
lib/core.sh |
set -euo pipefail, Farben, Logging nach stderr, Cleanup-Trap, Git-Prüfung, Lock-Datei. |
lib/config.sh |
Standardwerte, Laden der Config per source, Validierung, --init-config. |
lib/cli.sh |
parse_args, apply_cli_overrides, Hilfetext, --setup-alias. |
lib/repo-discovery.sh |
find-Suche nach .git-Verzeichnissen, Include-/Exclude-Filter, Remote-Prüfung. |
lib/git-ops.sh |
Alle Git-Aufrufe, Konflikt-Erkennung, Abbruch von Rebase und Merge, Stash. |
lib/sync.sh |
sync_repository, sync_all, Rückfragen, Statustabelle, Zusammenfassung. |
lib/inventory.sh |
Inventar-Parser, verify_inventory, Erkennung und Löschung nicht gelisteter Repositories. |
lib/issues.sh |
show_issues über die GitHub CLI. |
Entwurfsentscheidungen
- Subshells: Jede Funktion in
git-ops.shwechselt in einer Subshell mitcdin das Repository. Das Arbeitsverzeichnis des Hauptprozesses bleibt unverändert. - Dry-Run-Wrapper: Schreibende Befehle laufen über
git_cmd, das im Dry-Run nur[DRY-RUN] Would: git ...ausgibt. Lesende Befehle laufen immer. Weilsync_repositorypro Repository in einer Befehlssubstitution läuft und einige Aufrufe stderr verwerfen, sieht man die Zeilen nur fürgit addundgit commit. - Konflikterkennung: Das Tool vergleicht
git status --porcelainmitgit diff --name-only HEAD..<upstream>und meldet Dateien, die in beiden Listen stehen. - Lock-Datei: Enthält die PID. Beim Start prüft
kill -0, ob der Prozess läuft. Ein Cleanup-Trap aufEXIT,INTundTERMentfernt sie wieder. Es wird keinflockverwendet. Der Pfad steht schon vor der Prüfung fest, deshalb löscht auch eine zweite Instanz, die wegen der ersten abbricht, die Lock-Datei der ersten. - Config per
source: Es gibt keinen eigenen Parser. Dadurch sind Shell-Variablen in der Config möglich, aber die Datei wird ausgeführt. - Ausgabe:
--helpund--versionschreiben nach stdout, alle übrige Benutzerausgabe geht nach stderr. Über stdout laufen nur interne Zwischenwerte (Ergebnis pro Repository, Statistik-Zeichenketten). qin Rückfragen:exit 0läuft innerhalb der Befehlssubstitution vonsync_allund beendet nur diese Subshell. Das Repository zählt alsFailed.
Tests und CI
make test startet tests/run-tests.sh, das alle tests/test-*.sh ausführt. Die Tests decken CLI-Parsing, Config, Repository-Suche, Git-Operationen, Konfliktbehandlung, Inventar und den Windows-Installer ab. make lint führt ShellCheck aus, make format prüft mit shfmt -i 4 -ci -bn, make check führt alles zusammen aus. Die GitHub-Actions-Pipeline läuft ShellCheck, shfmt, PSScriptAnalyzer für install.ps1 und die Tests auf Ubuntu sowie Windows.