GitHub-Backup: So sichere ich meine Repositories lokal
GitHub ist bequem. Der Code ist zentral gespeichert, man kommt von überall dran und mit Git funktioniert das Ganze ohnehin ziemlich angenehm. Trotzdem bleibt bei mir ein Gedanke hängen: Was ist eigentlich, wenn ich irgendwann keinen Zugriff mehr auf meinen Account habe?
Klar, im Normalfall passiert das nicht. Der Account läuft, SSH funktioniert und die Repositories sind da. Aber über die Jahre sammelt sich einiges an. Alte Projekte, aktuelle Projekte, private Repositories, kleine Tools, Testprojekte und Software, an der man teilweise sehr lange gearbeitet hat.
Da möchte ich ehrlich gesagt nicht darauf angewiesen sein, dass ich auch in zehn Jahren noch problemlos an meinen GitHub-Account komme.
Mir geht es dabei gar nicht darum, GitHub komplett zu sichern. Issues, Pull Requests, Actions oder sonstige Funktionen sind für mich zweitrangig. Wichtig ist mir vor allem der Code.
Ein normales Backup reicht völlig aus
Zum Glück braucht man dafür keine spezielle Backup-Software. Git kann das selbst.
Statt ein Repository ganz normal zu klonen, kann man es als Mirror sichern:
git clone --mirror git@github.com:USERNAME/REPOSITORY.git
Dabei entsteht beispielsweise ein Verzeichnis wie:
MeinProjekt.git
Darin befindet sich kein ausgecheckter Projektordner, sondern das eigentliche Git-Repository.
Für ein Backup ist das ziemlich praktisch. Im Fall der Fälle kann man daraus später wieder ein normales Repository machen oder den kompletten Bestand auf einen anderen Git-Server übertragen.
Alle Repositories auf einmal sichern
Wenn man nur zwei oder drei Projekte hat, kann man die natürlich einzeln sichern. Mit der Zeit werden es aber schnell deutlich mehr.
Mit der GitHub CLI kann man sich alle Repositories des eigenen Accounts anzeigen lassen:
gh repo list USERNAME --limit 1000
Noch praktischer ist die Ausgabe nur mit den Repository-Namen:
gh repo list USERNAME --limit 1000 --json nameWithOwner -q '.[].nameWithOwner'
Damit lässt sich das Backup direkt automatisieren:
mkdir -p ~/git-backup
cd ~/git-backup
gh repo list USERNAME --limit 1000 --json nameWithOwner -q '.[].nameWithOwner' |
while read repo; do
echo "Backup: $repo"
git clone --mirror "git@github.com:$repo.git"
done
Damit werden alle Repositories nacheinander lokal gespiegelt.
SSH statt Passwort
Ich verwende dafür SSH. Das ist ohnehin praktisch, wenn man Git regelmäßig benutzt. Ob der Zugriff funktioniert, lässt sich schnell testen:
ssh -T git@github.com
Wenn der SSH-Key korrekt eingerichtet ist, kann Git anschließend auch private Repositories sichern.
Für die GitHub CLI muss man zusätzlich angemeldet sein:
gh auth login
Dann landen auch die privaten Repositories in der Liste.
Nicht jedes Mal alles neu herunterladen
Natürlich soll das Backup nicht jedes Mal wieder bei null anfangen.
Ist ein Repository bereits vorhanden, reicht ein Update:
git -C "MeinProjekt.git" remote update --prune
Damit werden neue Commits, Branches und Tags nachgeladen. Das lässt sich leicht in ein kleines Skript packen, das prüft, ob ein Repository schon vorhanden ist. Neue Projekte werden geklont, bestehende nur aktualisiert. Damit kann man das Backup regelmäßig laufen lassen, ohne jedes Mal alles neu herunterzuladen.
Und wenn GitHub wirklich einmal weg ist?
Dann wird es interessant. Die gesicherten Mirror-Repositories sind keine speziellen GitHub-Dateien.
Es sind ganz normale Git-Repositories. Ich könnte sie also später auf einen eigenen Server kopieren:
/srv/git/ ├── MeinProjekt.git ├── Projekt2.git └── Projekt3.git
Und anschließend direkt per SSH darauf zugreifen:
git clone user@meinserver:/srv/git/MeinProjekt.git
Mehr braucht es im einfachsten Fall gar nicht. Git und SSH reichen. Wer später noch eine Weboberfläche möchte, kann natürlich Gitea, Forgejo oder etwas Vergleichbares verwenden.
Fazit
Auch wenn ich nicht davon ausgehe, dass es mit GitHub irgendwann Probleme bereiten wird, mit einem Backup schläft es sich immer besser.
