Markus Michalski FAQ

git-sync-all: Verwendung

Aufruf, alle Optionen, Status-Tabelle, Dry-Run, Cron-Betrieb, Exit-Codes und Ausgabeformat von git-sync-all mit geprüften Beispielen.

English Version

Zurück zur Übersicht

git-sync-all: Verwendung

Aufruf

git-sync-all [OPTIONEN] [VERZEICHNIS...]

Ohne Argumente durchsucht das Tool die Verzeichnisse aus SYNC_BASE_DIRS (Standard ~/projekte). Übergibst du Verzeichnisse als Argumente, ersetzen sie SYNC_BASE_DIRS für diesen Lauf. Kurzoptionen lassen sich nicht zusammenfassen: -vv wird als unbekannte Option abgelehnt.

Optionen

Option Kurz Wirkung
--help -h Hilfe anzeigen und beenden
--version -V Version anzeigen und beenden
--dry-run -n Keine schreibenden Git-Befehle ausführen (siehe Abschnitt Dry-Run)
--verbose -v Debug-Ausgabe (SYNC_VERBOSITY=2)
--quiet -q Keine Info-, Warn- und OK-Meldungen (SYNC_VERBOSITY=0)
--yes -y Alle Rückfragen automatisch bestätigen
--config DATEI -c Andere Config-Datei laden
--init-config Config-Datei am XDG-Pfad anlegen
--setup-alias Git-Alias check anlegen
--no-pull Kein Fetch und kein Pull
--no-push Kein Push
--no-tags Tag-Synchronisierung überspringen
--no-commit Nicht committen
--no-color Keine Farben
--conflict-strategy WERT skip, stash oder commit
--status Nur Statustabelle, keine Sync-Aktionen
--verify Inventar prüfen (siehe Inventar)
--issues Offene GitHub-Issues der Inventar-Repositories anzeigen
--inventory DATEI Andere Inventar-Datei
--group NAME Inventar-Gruppe filtern, wiederholbar
--init-inventory Inventar-Datei am XDG-Pfad anlegen
--exclude MUSTER Repositories nach Verzeichnisname ausschließen, wiederholbar
--include MUSTER Nur passende Repositories synchronisieren, wiederholbar

--exclude und --include ersetzen die Werte von SYNC_EXCLUDE und SYNC_INCLUDE aus der Config. Beachte die Hinweise zur Rangfolge bei --yes, --no-tags, --no-color und --conflict-strategy.

Beispiele

git-sync-all
git-sync-all ~/arbeit ~/privat
git-sync-all --dry-run
git-sync-all --status
git-sync-all --exclude vendor --exclude "test-*"
git-sync-all --include "api-*"
git-sync-all --no-commit --no-push
git-sync-all --no-pull
git-sync-all --config ~/.config/git-sync-all/cron.conf

--include und --exclude vergleichen den Verzeichnisnamen des Repositories (nicht den Pfad) mit Bash-Glob-Mustern. Der Include-Filter greift zuerst, danach der Exclude-Filter.

Dry-Run

Im Dry-Run führt das Tool git add, commit, pull, push, stash und den Tag-Abruf nicht aus. Sichtbar als [DRY-RUN] Would: git ... werden aber nur git add und git commit. Die Ausgaben für Tag-Abruf, Stash, Pull und Push werden unterdrückt. Lesende Befehle laufen echt, darunter git status und ein git fetch <remote> <branch>, das die Remote-Tracking-Referenzen aktualisiert.

Im Dry-Run erscheinen Repositories mit Änderungen trotzdem als Synced, und die Rückfragen werden weiterhin gestellt. Es werden nur keine Änderungen geschrieben.

Status-Tabelle

REPOSITORY                          BRANCH          DIRTY      UNPUSHED   UNPULLED
--------------------------------------------------------------------------------
invoice-management                  main            3          2          --

DIRTY zählt die Zeilen von git status --porcelain, UNPUSHED die Commits gegenüber dem Upstream. UNPULLED zeigt immer --, weil im Status-Modus kein Fetch stattfindet. Danach druckt das Tool noch die Zusammenfassung. Die Spalte Clean entspricht dort der Zahl der Repositories ohne Änderungen.

Ausgabe

--help und --version schreiben nach stdout. Alle übrigen Ausgaben gehen nach stderr, stdout bleibt dann leer. Meldungen tragen die Präfixe [INFO], [WARN], [OK], [ERROR], [DEBUG] und [DRY-RUN]. Am Ende steht eine Zusammenfassung mit den Zählern Total, Clean, Synced, Skipped und Failed. -q unterdrückt Info-, Warn- und OK-Meldungen. Fehler, Rückfragen und die Zusammenfassung erscheinen weiterhin.

Abbruch mit q

Antwortest du bei einer Rückfrage mit q, meldet das Tool Aborted by user, beendet aber nur die Bearbeitung dieses einen Repositories. Es zählt als Failed, die übrigen Repositories werden weiter abgefragt und bearbeitet, und der Exit-Code ist am Ende 1. Um einen Lauf wirklich zu stoppen, brich ihn mit Strg+C ab.

Exit-Codes

Code Bedeutung
0 Lauf ohne fehlgeschlagene Repositories, auch wenn welche übersprungen wurden oder keine Repositories gefunden wurden.
1 Mindestens ein Repository ist fehlgeschlagen (Commit, Pull, Stash oder Push, auch Abbruch mit q). Außerdem Config-Fehler, unbekannte Option, laufende zweite Instanz, fehlendes git, bei --verify fehlende Repositories und bei --issues Repositories mit offenen Issues.

Automatischer Betrieb (Cron)

Ohne --yes und ohne Terminal überspringt das Tool jedes Repository mit Änderungen und meldet es als Skipped. Für Cron brauchst du daher eine Config mit SYNC_AUTO_CONFIRM=true, die du mit --config übergibst.

# ~/.config/git-sync-all/cron.conf enthält SYNC_AUTO_CONFIRM=true
0 18 * * 1-5 /usr/local/bin/git-sync-all --config $HOME/.config/git-sync-all/cron.conf --quiet 2>> $HOME/.local/log/git-sync.log

Die Ausgabe geht nach stderr, deshalb leitest du 2>> in die Logdatei um. Cron braucht Zugriff auf deine Zugangsdaten (SSH-Agent, Credential-Helper), sonst scheitern Pull und Push. Lies vorher die Sicherheitshinweise: Im Auto-Modus werden Änderungen ohne Rückfrage committet und gepusht.

Multi-Maschinen-Ablauf

git-sync-all            # Feierabend: committen und pushen
git-sync-all --verify   # neue Maschine: fehlende Repositories finden
git-sync-all            # Arbeitsbeginn: Änderungen holen

Was dabei pro Repository passiert, steht unter Sync-Ablauf.