Git-Mirror-Repositories einrichten und synchron halten
AI generated
git
HEAD
Git
Git-Mirror-Repositories
einrichten und synchron halten

Ein Mirror-Repository bildet ein Git-Repository nicht nur inhaltlich, sondern strukturell vollständig ab, inklusive aller Branches, Tags und internen Referenzen. Das eignet sich für Backups, Ausfallsicherheit und Migrationen zwischen Hosting-Plattformen, erfordert aber ein klares Verständnis davon, wie git push --mirror ein Ziel-Repository tatsächlich überschreibt.

9 Min. Lesezeit Git Backup

1. Wozu Mirror-Repositories gebraucht werden

Ein Mirror-Repository dient in erster Linie als vollständige, exakte Kopie eines bestehenden Repositories, üblicherweise auf einem anderen Server oder einer anderen Plattform. Der naheliegendste Einsatzzweck ist ein regelmäßiges Backup, das im Fall eines Ausfalls oder Datenverlusts des primären Git-Servers eine vollständige Wiederherstellung erlaubt, ohne auf einzelne Snapshots des Dateisystems angewiesen zu sein.

Ein zweiter häufiger Einsatzzweck ist die Migration zwischen zwei Hosting-Plattformen, etwa von einer selbst gehosteten GitLab-Instanz zu GitHub oder umgekehrt: Der Mirror hält beide Seiten während einer Übergangsphase synchron, bis das Team endgültig auf die neue Plattform umgestellt hat. Auch aus Compliance-Gründen wird gelegentlich ein interner Spiegel eines extern gehosteten Repositories verlangt, etwa weil unternehmensinterne Vorgaben verlangen, dass eine vollständige Kopie sämtlichen Quellcodes zusätzlich innerhalb der eigenen Infrastruktur vorgehalten wird, unabhängig davon, wo die eigentliche Zusammenarbeit stattfindet.

2. Der Unterschied zwischen --bare und --mirror beim Klonen

Ein Klon mit --bare erzeugt ein Repository ohne Working Directory, übernimmt dabei aber standardmäßig nur die Standard-Refspec, also im Wesentlichen die Branches, nicht zwangsläufig alle internen Referenzen wie Notes oder sämtliche Remote-Tracking-Branches der Quelle.

Ein Klon mit --mirror geht einen Schritt weiter: Er übernimmt ebenfalls keinen Working Tree, konfiguriert aber zusätzlich automatisch eine erweiterte Refspec, die wirklich jede Referenz aus der Quelle spiegelt, einschließlich aller Branches, Tags, Notes und Remote-Tracking-Referenzen. Für einen vollständigen, verlässlichen Spiegel ist --mirror deshalb die richtige Wahl, nicht --bare.


# Vollständigen Mirror-Klon der Quelle erzeugen
git clone --mirror https://git.quelle.example/projekt.git

3. Ein Mirror-Repository initial erstellen

Der erste Schritt ist der Mirror-Klon der Quelle, wodurch ein lokales bare Repository mit allen Referenzen entsteht. Anschließend wird ein neues, leeres Repository auf der Zielplattform angelegt und als zusätzliches Remote in genau diesem lokalen Mirror-Klon eingetragen.

Mit git push --mirror gegen dieses neue Remote werden anschließend sämtliche Referenzen, also alle Branches und Tags, unverändert in das Ziel-Repository übertragen, wodurch die Zielplattform von Anfang an exakt denselben Stand wie die Quelle erhält.


cd projekt.git
git remote add ziel https://git.ziel.example/projekt.git
git push --mirror ziel

4. Den Mirror aktuell halten mit fetch und push

Für die laufende Synchronisation reicht ein git remote update, das alle konfigurierten Refspecs des lokalen Mirror-Klons neu abholt und dabei sowohl neue Commits als auch neue oder gelöschte Branches und Tags berücksichtigt.

Direkt danach überträgt ein erneutes git push --mirror gegen das Ziel-Remote genau diesen aktualisierten Stand vollständig weiter, sodass Quelle und Ziel nach jedem Synchronisationslauf wieder exakt übereinstimmen, inklusive zwischenzeitlich gelöschter Referenzen.


cd projekt.git
git remote update
git push --mirror ziel

5. Synchronisation automatisieren mit Cronjob oder CI-Schedule

In der Praxis läuft dieser Zwei-Schritt-Ablauf üblicherweise nicht manuell, sondern über einen periodischen Cronjob, der alle paar Minuten oder Stunden fetch und push nacheinander ausführt, oder alternativ über eine geplante CI-Pipeline, die dasselbe Skript auf einem eigenen Zeitplan aufruft.

Wichtig für eine belastbare Automatisierung ist eine saubere Fehlerbehandlung: Schlägt der fetch etwa wegen eines vorübergehenden Netzwerkausfalls fehl, sollte der nachfolgende push in diesem Lauf nicht mehr ausgeführt werden, um niemals einen veralteten, nur teilweise aktualisierten Stand ins Ziel-Repository zu übertragen.


#!/bin/bash
set -e
cd /srv/mirrors/projekt.git
git remote update
git push --mirror ziel

6. Force-Push und gelöschte Branches im Mirror korrekt abbilden

git push --mirror überschreibt das Ziel-Repository exakt nach dem Stand des lokalen Mirror-Klons, einschließlich zwischenzeitlich gelöschter Branches und Tags, die dabei auch im Ziel-Repository entfernt werden. Das ist beabsichtigtes Verhalten für einen echten Spiegel, kann bei einer fehlerhaften Konfiguration aber genauso echte Daten im Ziel-Repository unwiederbringlich löschen.

Aus diesem Grund sollte ein Ziel-Repository, das per Mirror-Push befüllt wird, niemals gleichzeitig von Menschen direkt beschrieben werden. Jede manuelle Änderung im Ziel, die nicht auch in der Quelle existiert, geht beim nächsten automatisierten Synchronisationslauf ersatzlos verloren.

7. Mirror als Zwischenschritt bei einer Plattform-Migration

Bei einer geplanten Migration, etwa von GitLab zu GitHub, hält ein regelmäßig laufender Mirror beide Plattformen während der gesamten Übergangsphase synchron, während das Team weiterhin gewohnt gegen die alte Plattform arbeitet. Das reduziert das Risiko eines abrupten Umstiegs erheblich, da jederzeit ein vollständiger, aktueller Stand auf der neuen Plattform vorliegt.

Der eigentliche Umstieg erfolgt dann nicht technisch, sondern organisatorisch: Sobald das Team bereit ist, wird die alte Plattform schreibgeschützt gesetzt, ein letzter finaler Synchronisationslauf durchgeführt, und anschließend die Standard-Remote-URL im lokalen Setup jedes Teammitglieds auf die neue Plattform umgestellt. In dieser Übergangsphase lohnt sich zusätzlich eine kurze, für alle sichtbare Notiz in beiden Plattformen, welche Seite gerade als verbindliche Quelle gilt, damit niemand versehentlich noch gegen die bald abzuschaltende alte Plattform arbeitet, während der Mirror bereits im Hintergrund synchronisiert.

8. Push-Mirroring gegenüber eingebautem Pull-Mirroring der Plattformen

GitLab bietet in den Projekteinstellungen ein natives Pull-Mirroring an, bei dem GitLab selbst in konfigurierbaren Intervallen von einer externen Quelle abholt, ohne dass ein eigener Cronjob oder eine eigene Pipeline dafür betrieben werden muss. GitHub bietet eine vergleichbare Funktion nicht direkt in den Bordmitteln an, lässt sich aber über eine geplante GitHub Action mit demselben fetch-und-push-Ablauf nachbilden.

Der Unterschied zum manuellen CLI-Ansatz liegt vor allem in der Kontrolle: Natives Plattform-Mirroring ist bequemer, macht aber vollständig von der jeweiligen Plattformfunktion abhängig, während ein eigenes Skript unabhängig von beiden beteiligten Plattformen läuft und sich frei um zusätzliche Prüfungen wie Benachrichtigungen bei fehlgeschlagener Synchronisation erweitern lässt.

9. Mirror-Status überwachen und Inkonsistenzen erkennen

Ein einfacher, aber wirksamer Prüfschritt vergleicht die Ausgabe von git ls-remote für Quelle und Ziel: Stimmen die Listen der Referenzen und der dazugehörigen Commit-Hashes überein, war die letzte Synchronisation erfolgreich, andernfalls deutet eine Abweichung auf einen fehlgeschlagenen oder unvollständigen Lauf hin.

In einer produktiv genutzten Automatisierung gehört zu einem solchen Vergleich zusätzlich eine Alarmierung, etwa per E-Mail oder Chat-Benachrichtigung, sobald zwei aufeinanderfolgende Synchronisationsläufe fehlschlagen, damit ein veralteter Mirror nicht unbemerkt über einen längeren Zeitraum bestehen bleibt. Ergänzend bietet sich eine kurze Protokolldatei an, die Zeitpunkt und Ergebnis jedes einzelnen Laufs festhält, sodass sich im Fall einer Störung sofort nachvollziehen lässt, seit wann genau die Abweichung zwischen Quelle und Ziel tatsächlich besteht.


# Referenzlisten von Quelle und Ziel vergleichen
diff <(git ls-remote https://git.quelle.example/projekt.git) \
     <(git ls-remote https://git.ziel.example/projekt.git)
Kriterium git clone --mirror git clone --bare Natives Plattform-Mirroring
Working Tree Nein Nein Nein, plattformseitig verwaltet
Umfang der gespiegelten Refs Alle Refs inklusive Notes Nur Standard-Refspec Abhängig von der Plattform
Steuerung des Zeitplans Vollständig selbst, per Cron oder CI Vollständig selbst Über Plattform-Einstellungen, meist eingeschränkt
Plattformunabhängig einsetzbar Ja Ja Nein, an die jeweilige Plattform gebunden
Eignet sich für vollständige Backups Ja, empfohlener Standard Bedingt, ohne alle Refs Bedingt, abhängig von Funktionsumfang

Mironsoft

Git-Workflows, Branching-Strategien und CI-Hooks

Chaotische Git-Historie und unklare Branching-Regeln im Team?

Wir richten saubere Git-Workflows ein, klären Branching-Strategien fürs Team und automatisieren Qualitätschecks über Git-Hooks und CI-Pipelines, damit die Historie nachvollziehbar bleibt.

Workflow-Audit

Bestehende Branching-Strategie und Merge-Praxis auf Schwachstellen prüfen.

Hook-Automatisierung

Pre-Commit- und Pre-Push-Hooks für Linting, Tests und Commit-Konventionen einrichten.

Team-Schulung

Rebase, Cherry-Pick und Konfliktauflösung im Team praxisnah vermitteln.

10. Zusammenfassung

Git-Mirror-Repositories

Kernidee

git clone --mirror und git push --mirror bilden ein Repository inklusive aller Refs exakt auf einem Ziel-Server ab.

Wichtiger Unterschied

--mirror spiegelt wirklich jede Referenz, --bare übernimmt standardmäßig nur die Standard-Refspec.

Typischer Einsatz

Backups, Migrationen zwischen Hosting-Plattformen und interne Spiegel aus Compliance-Gründen.

Wichtigste Regel

Ein per Mirror-Push befülltes Ziel-Repository darf niemals gleichzeitig manuell beschrieben werden.

11. FAQ: Git-Mirror-Repositories

1Was ist der wichtigste Unterschied zwischen --mirror und --bare beim Klonen?
Ein --mirror Klon spiegelt wirklich jede Referenz der Quelle inklusive Notes und Remote-Tracking-Branches, während --bare standardmäßig nur die Standard-Refspec, im Wesentlichen die Branches, übernimmt.
2Werden gelöschte Branches beim nächsten Synchronisationslauf auch im Ziel entfernt?
Ja, git push --mirror überschreibt das Ziel-Repository exakt nach dem aktuellen Stand des lokalen Mirror-Klons, gelöschte Referenzen werden also auch im Ziel entfernt.
3Kann ich das Ziel-Repository parallel auch manuell direkt beschreiben?
Davon ist dringend abzuraten, da jede manuelle Änderung im Ziel, die nicht auch in der Quelle existiert, beim nächsten automatisierten Synchronisationslauf ersatzlos überschrieben wird.
4Wie oft sollte ein Mirror-Repository synchronisiert werden?
Das hängt vom Anwendungsfall ab, für ein reines Backup reicht meist ein stündlicher oder täglicher Lauf, für eine aktive Migrationsphase empfiehlt sich ein deutlich kürzeres Intervall von wenigen Minuten.
5Bietet GitLab eine eingebaute Alternative zum manuellen Mirror-Skript?
Ja, GitLab bietet in den Projekteinstellungen natives Pull-Mirroring an, bei dem die Plattform selbst in konfigurierbaren Intervallen von einer externen Quelle abholt.
6Wie erkenne ich, ob ein Mirror-Lauf tatsächlich erfolgreich war?
Ein Vergleich der Ausgabe von git ls-remote für Quelle und Ziel zeigt direkt, ob beide Seiten dieselben Referenzen mit denselben Commit-Hashes führen.
7Was passiert, wenn der fetch-Schritt wegen eines Netzwerkfehlers fehlschlägt?
Bei sauberer Fehlerbehandlung im Automatisierungsskript sollte der nachfolgende push-Schritt in diesem Lauf gar nicht erst ausgeführt werden, um keinen unvollständigen Stand ins Ziel zu übertragen.
8Eignet sich ein Mirror auch als Ersatz für ein reguläres Datenbank-Backup?
Nein, ein Git-Mirror sichert ausschließlich den Inhalt des Repositories selbst, für ein produktives System gehören weiterhin separate Backups aller anderen Datenquellen dazu.
9Kann ich mehrere Ziel-Repositories gleichzeitig aus einer Quelle spiegeln?
Ja, dazu genügt es, mehrere Remotes im lokalen Mirror-Klon einzutragen und den Push-Schritt für jedes Ziel-Remote nacheinander im selben Automatisierungsskript auszuführen.
10Ist ein Mirror-Repository für sich genommen bereits ein vollständiges Backup?
Für den reinen Code-Inhalt ja, allerdings sollten begleitende Daten wie Issues, Pull-Request-Diskussionen oder CI-Konfiguration der Plattform gegebenenfalls zusätzlich separat gesichert werden, da diese nicht Teil der reinen Git-Referenzen sind.