Diese Sammlung enthält Python- und Shell-Scripte für den täglichen Umgang mit mehreren Git-Repositories sowie für die automatische Pflege von Maven-Abhängigkeiten.
- Schnellstart: Aliases einrichten
- Übersicht aller Tools
- git_pull_all.py – Alle Repos aktualisieren
- git_status_all.py – Status aller Repos
- scan_git_repos.py – Repos auflisten
- mirror_git_repos.py – GitHub → Gitea spiegeln
- gh-no-mirror.py – Repos ohne Mirror-Tag finden
- update-pom.py – Maven-Abhängigkeiten aktualisieren
- find_big_files_in_git_history.sh – Große Dateien in Git-History finden
Das Script add_aliases.sh trägt alle Tools als kurze Shell-Aliases
in ~/.bashrc ein, sodass sie von überall aufrufbar sind.
chmod +x add_aliases.sh
./add_aliases.sh
source ~/.bashrcMit -f werden bestehende Aliases überschrieben:
./add_aliases.sh -fNach der Einrichtung stehen folgende Kurzbefehle zur Verfügung:
| Alias | Befehl | Bedeutung |
|---|---|---|
gu |
git_pull_all.py ~/git |
Alle Repos updaten (pull) |
gs |
git_status_all.py ~/git |
Status aller Repos anzeigen |
gl |
scan_git_repos.py ~/git |
Repos listen (Branch + Remote) |
gm |
mirror_git_repos.py ~/git |
GitHub → Gitea mirroren |
gnm |
gh-no-mirror.py |
Repos ohne Mirror-Tag anzeigen |
up |
update-pom.py |
Maven-Abhängigkeiten updaten |
| Script | Sprache | Zweck |
|---|---|---|
add_aliases.sh |
Bash | Aliases in ~/.bashrc eintragen |
git_pull_all.py |
Python | git pull in allen Unterordner-Repos |
git_status_all.py |
Python | git status für alle Repos auf einen Blick |
scan_git_repos.py |
Python | Branch und Remote-URLs aller Repos auflisten |
mirror_git_repos.py |
Python | GitHub-Repos mit Topic mirror nach Gitea spiegeln |
gh-no-mirror.py |
Python | GitHub-Repos ohne mirror-Topic finden |
update-pom.py |
Python | Maven pom.xml auf neueste Versionen aktualisieren |
find_big_files_in_git_history.sh |
Bash | Dateien > 50 KB in der Git-History aufspüren |
Führt git pull in jedem Git-Repository aus, das sich als direkter Unterordner
im angegebenen Basisverzeichnis befindet. Repos ohne Remote werden übersprungen.
python3 git_pull_all.py [VERZEICHNIS]
# oder per Alias:
guOhne Argument wird das aktuelle Verzeichnis verwendet.
📂 Pulling in raspberrypi
Already up to date.
📂 Pulling in my-app
Updating abc1234..def5678
⏭️ local-only hat kein Remote konfiguriert – wird übersprungen
- Verzeichnisse ohne
.git-Ordner werden stillschweigend übersprungen - Repos ohne Remote (
git remoteleer) werden mit Hinweis übersprungen - Fehler beim Pull werden gemeldet, das Script läuft aber weiter
Zeigt git status --short für alle Git-Repos im Basisverzeichnis, alphabetisch sortiert.
Repos ohne Änderungen werden als "sauber" markiert.
python3 git_status_all.py [VERZEICHNIS]
# oder per Alias:
gs✅ my-clean-repo [main] – sauber
📂 my-changed-repo [feature/xyz] – Änderungen:
M src/main/App.java
?? new-untracked-file.txt
✅ raspberrypi [main] – sauber
Jede Zeile enthält den Repo-Namen und den aktuellen Branch in eckigen Klammern.
Listet alle Git-Repositories im angegebenen Verzeichnis mit Branch-Name und konfigurierten Remote-URLs auf. Ohne Argument wird das Home-Verzeichnis durchsucht.
python3 scan_git_repos.py [VERZEICHNIS]
# oder per Alias:
gl🔍 Scanning Git repositories in: /home/samuel/git
📁 raspberrypi
🌿 Branch: main
🔗 Remote: https://github.com/wlanboy/raspberrypi.git
📁 my-app
🌿 Branch: develop
🔗 Remote: https://git.gmk.lan:3300/github/my-app.git
🔗 Remote: https://github.com/wlanboy/my-app.git
📁 local-only
🌿 Branch: main
🔗 Kein Remote konfiguriert
Liest alle eigenen GitHub-Repositories, filtert nach dem Topic mirror und erstellt
für jedes gefundene Repo einen Mirror in der Gitea-Instanz (Organisation github).
Bereits vorhandene Mirrors werden übersprungen.
Drei Variablen müssen vor dem Start gesetzt sein:
export GITHUB_USERNAME="dein-github-username"
export GITHUB_TOKEN="ghp_xxxxxxxxxxxxxxxxxxxx"
export GITEA_TOKEN="dein-gitea-api-token"Den Gitea-Token erstellen unter: https://git.gmk.lan:3300/user/settings/applications
python3 mirror_git_repos.py
# oder per Alias:
gm- Optional: Alle bestehenden Repos in der Gitea-Org
githublöschen - Alle eigenen GitHub-Repos abrufen
- Repos ohne Topic
mirrorüberspringen - Für jeden gefundenen Repo einen Mirror in Gitea anlegen (alle 8 Stunden synchronisiert)
🚀 Starte Mirror-Sync...
❓ Alle Repos in Gitea-Org löschen? (ja/[nein]): nein
⏭ Überspringe raspberrypi (existiert bereits)
➕ Erstelle Mirror für my-app (Private: False)...
✔ Spiegel erstellt: my-app
In mirror_git_repos.py anpassbar:
| Variable | Standardwert | Bedeutung |
|---|---|---|
TOPIC_FILTER |
"mirror" |
Nur Repos mit diesem GitHub-Topic werden gespiegelt |
GITEA_URL |
"https://git.gmk.lan:3300" |
URL der Gitea-Instanz |
GITEA_ORG |
"github" |
Ziel-Organisation in Gitea |
MIRROR_INTERVAL |
"8h0m0s" |
Wie oft Gitea den Mirror aktualisiert |
Hinweis: Das Script verwendet
ssl._create_unverified_context(), da die Gitea-Instanz ein selbstsigniertes Zertifikat nutzt.
Listet alle eigenen GitHub-Repos, die das Topic mirror nicht haben. Nützlich,
um zu prüfen, welche Repos noch nicht für den Mirror-Sync vorgemerkt sind.
Voraussetzung: GitHub CLI installiert und eingeloggt mit gh auth login.
python3 gh-no-mirror.py
# oder per Alias:
gnm=== Kein 'mirror' Topic (aber andere Tags vorhanden) ===
wlanboy/my-private-tool
wlanboy/work-in-progress
=== Gar keine Topics ===
wlanboy/old-experiment
wlanboy/untitled-project
# Topic auf GitHub setzen
gh repo edit wlanboy/my-private-tool --add-topic mirror
# Danach mirror_git_repos.py ausführen
gmLiest eine pom.xml, prüft für jede Dependency, jedes Plugin und das Parent-POM
die aktuelle Release-Version auf Maven Central und aktualisiert die Datei in-place.
Anschließend wird mvn package -DskipTests ausgeführt, um den Build zu validieren.
Bei Fehlschlag wird die Original-pom.xml automatisch wiederhergestellt.
Voraussetzungen: Python 3.10+ und Maven (mvn) im PATH.
python3 update-pom.py [VERZEICHNIS]
# oder per Alias (im aktuellen Verzeichnis):
upOhne Argument wird im aktuellen Verzeichnis nach pom.xml gesucht.
- Backup der
pom.xmlerstellen (pom.xml.bak) - Alle
<dependency>,<plugin>und<parent>-Versionen prüfen - Neueste stabile Version von Maven Central abfragen
- Downgrades werden automatisch abgelehnt
pom.xmlmit aktualisierten Versionen schreibenmvn package -DskipTestsausführen- Bei Erfolg: Backup löschen, fertige Commit-Message ausgeben
- Bei Fehler:
pom.xml.bakwiederherstellen
Backup erstellt: pom.xml.bak
Lese pom.xml und prüfe Abhängigkeiten ...
Prüfe org.springframework.boot:spring-boot-starter-parent (3.3.0)
-> Update: 3.3.0 → 3.4.1
Prüfe org.springframework.boot:spring-boot-starter-web (3.3.0)
-> bereits aktuell (3.3.0)
Prüfe com.fasterxml.jackson.core:jackson-databind (2.17.0)
-> Update: 2.17.0 → 2.18.2
2 Update(s) in pom.xml geschrieben.
Starte Maven-Build: mvn package -DskipTests ...
Build erfolgreich.
============================================================
COMMIT MESSAGE
============================================================
pom updater: bump dependencies to latest releases
- org.springframework.boot:spring-boot-starter-parent: 3.3.0 → 3.4.1
- com.fasterxml.jackson.core:jackson-databind: 2.17.0 → 2.18.2
Verified with: mvn package -DskipTests
============================================================
| Element | Bedingung |
|---|---|
<parent> |
Immer, wenn Version explizit angegeben |
<dependency> |
Nur bei expliziter Version (kein ${...}-Platzhalter) |
<plugin> |
Nur bei expliziter Version (kein ${...}-Platzhalter) |
Versions-Platzhalter wie ${spring.version} werden nicht angefasst –
diese müssen manuell in <properties> gepflegt werden.
Durchsucht alle Git-Repositories im aktuellen Verzeichnis nach Dateien, die in der Git-History größer als 50 KB sind – auch wenn sie inzwischen gelöscht wurden. Nützlich vor dem Spiegeln oder Aufräumen eines Repos.
Im übergeordneten Verzeichnis ausführen, das die Git-Repos enthält:
cd ~/git
bash find_big_files_in_git_history.sh===== Prüfe Git-Repo: my-app/ =====
blob a1b2c3d4 102400 src/main/resources/large-fixture.json
blob e5f6a7b8 75320 old-binary.jar
===== Prüfe Git-Repo: raspberrypi/ =====
Überspringe not-a-repo/ (kein Git-Repo)
Nach dem Identifizieren unerwünschter großer Dateien:
# Mit git-filter-repo (empfohlen, muss installiert werden)
pip install git-filter-repo
git filter-repo --path path/to/large-file.jar --invert-paths
# Danach force-push (nur nach Abstimmung mit dem Team!)
git push origin --force --allWarnung: Das Umschreiben der Git-History ändert alle Commit-Hashes. Nur in Repos ohne aktive Zusammenarbeit oder nach Abstimmung mit dem Team durchführen.