Blog

Git Mirror Repository: Backup, Migration und Ausfallsicherheit für Code-Repositories

Ein Mirror-Repository repliziert den vollständigen Referenz-Namensraum eines Repositorys statt nur eine bequeme Kopie zu ziehen. Wir ordnen ein, wann sich das für Backup, Migration und Disaster Recovery lohnt – und wo die typischen Fallstricke bei Automatisierung und Git LFS liegen.

Ein Mirror-Repository ist kein Fork und keine bequeme Kopie: Es repliziert den vollständigen Referenz-Namensraum eines Repositorys – Branches, Tags und Notes eingeschlossen – auf ein zweites, unabhängiges Ziel. Wer Code und Dokumentation als Vermögenswert behandelt, findet darin ein Werkzeug für Backup, Migration und Ausfallsicherheit. Wir ordnen ein, wann sich das lohnt, wie die Automatisierung zuverlässig bleibt und wo die typischen Lücken liegen.

Das Wichtigste vorab

Ein Mirror ist das richtige Werkzeug, wenn es um exakte Ref-Replikation und Verfügbarkeit geht – nicht um Zusammenarbeit. Für gemeinsames Arbeiten an Code bleibt ein Fork oder ein normaler Clone die passendere Wahl; für Backup, Migration und Disaster Recovery ist der Mirror der zuverlässigere Weg.

Was ein Mirror-Repository ist

Technisch entsteht ein Mirror durch einen sogenannten Bare Clone, der den kompletten Referenz-Namensraum eines Repositorys übernimmt – nicht nur den aktuell ausgecheckten Stand eines einzelnen Branches. Ein normaler git clone reicht dafür nicht aus, weil er standardmäßig nur die Standard-Referenzen für die tägliche Arbeit einrichtet. Für eine vollständige Replikation ist die Option --mirror vorgesehen, die alle Refs inklusive Tags und Notes überträgt.

Ein Mirror ist damit bewusst als Betriebsinfrastruktur gedacht, nicht als Entwicklungsumgebung: kein Arbeitsverzeichnis, keine lokalen Commits, keine Interaktion durch einzelne Entwickler:innen. Ein dediziertes Verzeichnis, ein Service-Account statt persönlicher Zugangsdaten und eingeschränkte Berechtigungen halten diese Trennung auch organisatorisch ein.

Wann sich ein Mirror lohnt – und wann nicht

Fork, einfacher Clone und Mirror lösen unterschiedliche Probleme. Die folgende Einordnung hilft bei der Wahl des passenden Werkzeugs für den jeweiligen Zweck.

Tabelle horizontal scrollen

AnforderungMirrorForkEinfacher Clone
Exakte Refs und TagsSehr gut geeignetSchwachSchwach
Backup-ZielSehr gut geeignetSchlecht geeignetEingeschränkt
Laufende ZusammenarbeitEingeschränkt geeignetSehr gut geeignetSchlecht geeignet
MigrationSehr gut geeignetSchlecht geeignetEingeschränkt
Read-only Kopie vor OrtGut geeignetSchlecht geeignetSehr gut geeignet
Eigene Einordnung in Anlehnung an die Entscheidungsmatrix von Server Scheduler, siehe Quellen.

Als Faustregel gilt: Mirroring, wenn Fidelity und Verfügbarkeit im Vordergrund stehen. Forks, wenn Zusammenarbeit das eigentliche Ziel ist. Wer beides vermischt – etwa einen Fork dauerhaft als Backup-Strategie behandelt –, verliert genau die Ref-Genauigkeit, die ein Mirror eigentlich garantieren soll.

Der grundlegende Einrichtungsprozess

Das Grundmuster besteht aus einem initialen Bare-Mirror-Clone, einem zusätzlichen Remote für das Sync-Ziel und einem regelmäßigen Fetch-und-Push-Zyklus:

git clone --mirror https://quelle.example/team/projekt.git /pfad/zu/mirrors/projekt.git
cd /pfad/zu/mirrors/projekt.git
git remote add ziel https://ziel.example/team/projekt.git
git fetch --prune origin
git push --mirror ziel

fetch --prune entfernt lokal gelöschte Referenzen, bevor push --mirror den kompletten Stand auf das Ziel überträgt – nur in dieser Reihenfolge bleibt der Mirror ein exaktes Abbild und keine wachsende Ansammlung veralteter Branches.

Automatisierung: die häufigsten Fehlerquellen

Ein Mirror-Job, der regelmäßig per Cron läuft, ist damit noch nicht automatisch verlässlich. In der Praxis tauchen immer wieder dieselben Probleme auf:

  • Gleichzeitige Läufe: Zwei parallel laufende Sync-Jobs können den Referenzzustand beschädigen.
  • Abgelaufene Zugangsdaten: Ein stillschweigend fehlschlagender Job erzeugt unbemerkten Drift zwischen Quelle und Ziel.
  • Manuelle Hotfixes am Mirror: Jede direkte Änderung am Mirror-Ziel untergräbt die Annahme einer einzigen verbindlichen Quelle.
  • Ungeprüfte Synchronisationen: Ein Cron-Eintrag, der „gelaufen“ meldet, beweist noch nicht, dass die Refs tatsächlich übereinstimmen.

Eine Lockfile-basierte gegenseitige Ausschlusssperre verhindert überlappende Job-Läufe zuverlässig. Ein separates Log je Sync-Lauf macht zudem nachvollziehbar, ob ein Job tatsächlich erfolgreich war – nicht nur, dass er gestartet wurde.

Bidirektionale Synchronisation: mit Vorsicht einsetzen

Die meisten Anwendungsfälle – Backup, Disaster Recovery, Migration – kommen mit einseitigem Mirroring aus und tragen das geringste Risiko. Ereignisgesteuerte Zwei-Wege-Synchronisation kann für befristete Übergangsphasen sinnvoll sein, dauerhafte bidirektionale Synchronisation bleibt dagegen die Ausnahme mit dem höchsten Risiko.

Ein technisches Werkzeug löst kein organisatorisches Problem

Bidirektionales Mirroring beantwortet die technische Frage der Synchronisation, nicht die organisatorische Frage nach der verbindlichen Quelle. Wenn Teams sich nicht einig sind, welches Repository maßgeblich ist, verstärkt Zwei-Wege-Replikation diese Uneinigkeit eher, als sie aufzulösen.

Git LFS: die unterschätzte Lücke

Standard-Mirror-Vorgänge übertragen Git-Objekte und Referenzen zuverlässig – große, über Git LFS verwaltete Dateien werden dabei aber leicht übersehen. Ein Mirror kann äußerlich gesund wirken und im Ernstfall trotzdem für eine Wiederherstellung unbrauchbar sein, wenn LFS-Inhalte fehlen. Vor dem produktiven Einsatz gehört deshalb eine explizite Prüfung dazu:

  1. Prüfen, ob und wo LFS über .gitattributes und git lfs ls-files tatsächlich genutzt wird.
  2. Sicherstellen, dass Quelle und Ziel LFS für den verwendeten Transportweg unterstützen.
  3. Explizite LFS-Fetch- und -Push-Schritte in die Automatisierung aufnehmen, statt sie stillschweigend vorauszusetzen.
  4. Wiederherstellung regelmäßig in einer sauberen Umgebung tatsächlich testen, nicht nur den Sync-Lauf selbst.

Dauerhafte Zuverlässigkeit: die Wartungsroutine

Ein Mirror bleibt nur so lange nützlich, wie regelmäßig geprüft wird, ob er hält, was er verspricht. Drei Punkte gehören in eine laufende Wartungsroutine:

  • Referenz-Abgleich: regelmäßiger Vergleich der lokalen Refs gegen Quelle und Ziel.
  • Wachstum im Blick behalten: Objektanzahl und Speicherbedarf beobachten, da sie Wartungsvorgänge wie git gc --aggressive spürbar verteuern.
  • Wiederherstellbarkeit testen: in Abständen einen vollständigen Clone aus dem Mirror ziehen, um die tatsächliche Backup-Tauglichkeit zu belegen.

Ein Mirror, aus dem noch nie wiederhergestellt wurde, ist zunächst nur eine Annahme – kein belegtes Backup. Erst der erfolgreiche Restore macht daraus eine verlässliche Absicherung.

Warum das für eine selbst betriebene GitLab-Instanz zählt

Wer Code und Dokumentation ohnehin auf einer eigenen, dedizierten GitLab-Instanz betreibt, kann dieselbe Instanz zusätzlich als automatisch synchronisiertes Mirror-Ziel einrichten – etwa für Backup, für eine geplante Migration oder als Ausfallsicherung neben einer bestehenden Plattform. Das ist ein mögliches Einsatzmuster unter mehreren, kein Ersatz für die eigentliche Betriebsverantwortung einer Instanz.

Quellen

  1. Git: git-clone – offizielle Dokumentation der Option --mirror und des Bare-Repository-Verhaltens.
  2. Git: git-push – offizielle Dokumentation der Option --mirror beim Push auf ein Ziel-Repository.
  3. Server Scheduler: Git Mirror Repository – A Complete How-To Guide – Entscheidungsmatrix, Automatisierungspraxis und Betriebshinweise für Mirror-Repositories.

Quellen abgerufen am 3. August 2026. Kommandosyntax und Produktverhalten können sich mit neueren Git- oder GitLab-Versionen ändern; dieser Beitrag ist keine Rechtsberatung und ersetzt keine eigene Prüfung der jeweils aktuellen Dokumentation vor dem produktiven Einsatz.

Hat dir dieser Beitrag weitergeholfen?