Ein Git-Repo vollständig sichern?

136

Gibt es eine einfache Möglichkeit, ein gesamtes Git-Repo einschließlich aller Zweige und Tags zu sichern?

Daniel Upton
quelle
2
Ich denke, Sie beziehen sich hier auf ein lokales Git-Repos.
Ztyx
2
Mögliches Duplikat von Backup a Local Git Repository
Martin Thoma
3
Die richtige Antwort lautet: git clone --mirror [email protected]/your-repo.git Dies kopiert Ihr gesamtes Repository, Notizen, Zweige, Tracking usw.
John
Einige von mir durchgeführte Websuchen, bei denen diese Frage nicht in den Ergebnissen enthalten war: "Git-Klon absolut alles verzweigt Tags-Notizen"; "git klone alles im Repository"; "git klone ein Repo mit allen Tags Notizen".
Kenny Evitt

Antworten:

64

Was ist mit einem Klon daraus?

git clone --mirror other/repo.git

Jedes Repository ist eine Sicherung seiner Fernbedienung.

KingCrunch
quelle
7
@ Daniel: Wenn Sie ein Repository klonen, rufen Sie jeden Zweig ab, aber nur der Standardzweig wird ausgecheckt. Versuchen Sie es git branch -a. Vielleicht ist es auf diese Weise offensichtlicher: Nach dem Klonen eines Repositorys rufen Sie nicht jeden Zweig ab, sondern jedes Commit. Zweige verweisen nur auf ein vorhandenes Commit.
KingCrunch
1
Ich denke, er kennt den Klonbefehl gut, wenn er eine solche Frage stellen kann, und es ist eindeutig nicht genug für ihn (weil es ein Klon und kein Dump ist). Dumps sind verschiedene Dinge wie einfache Kopien, zum Beispiel: 1) Sie müssen nicht optimal (oder sogar fähig) für normale Arbeit sein. 2) Sie müssen jedoch eine gute Beständigkeit und Reparaturfähigkeit gegen Datenkorruption aufweisen.
Peterh
@ Peterh Sicher, aber git clonedeckt das alles ab. (1) ist optional, keine Voraussetzung. Wenn das Ergebnis noch optimiert ist, ist es immer noch ein Backup (2), das bereits von git selbst abgedeckt wird. - Der Punkt, den ich geben möchte, ist, dass, wenn Sie git clonebereits die relevanten Punkte abdecken, für was Sie ein anderes Werkzeug benötigen? Obwohl ich es auch vorziehe git bundle, denke ich nicht, dass meine Antwort falsch oder ungültig ist. Sie können beide Ansätze als Hot-vs-Cold-Backup betrachten.
KingCrunch
Was ist mit Dateiberechtigungen? Kopiert Git-Klon diese unbedingt? hängt von den Optionen ab, die ich glaube
Antirealm
192
git bundle

Ich mag diese Methode, da sie nur eine Datei ergibt , die einfacher zu kopieren ist.
Siehe ProGit: kleines Bündel Freude .
Siehe auch " Wie kann ich jemandem ein Git-Repository per E-Mail senden? ", Wo der Befehl steht

git bundle create /tmp/foo-all --all

ist detailliert:

git bundleverpackt nur Referenzen, die von git show-ref angezeigt werden : Dies schließt Köpfe, Tags und Remote-Köpfe ein.
Es ist sehr wichtig, dass die verwendete Basis vom Ziel gehalten wird.
Es ist in Ordnung, auf Nummer sicher zu gehen, da die Bundle-Datei bereits im Ziel befindliche Objekte enthält, da diese beim Entpacken am Ziel ignoriert werden.


Um dieses Bundle zu verwenden, können Sie es klonen und einen nicht vorhandenen Ordner angeben (außerhalb eines Git-Repos):

git clone /tmp/foo-all newFolder
VonC
quelle
11
add --all für vollständige Sicherung
sehe
1
Dies git bundleist meiner Meinung nach die richtige Antwort und nicht die akzeptierte. Ich denke, er kennt den Klonbefehl gut, wenn er eine solche Frage stellen kann, und es ist eindeutig nicht genug für ihn (weil es ein Klon und kein Dump ist). Dumps sind verschiedene Dinge wie einfache Kopien, zum Beispiel: 1) Sie müssen nicht optimal (oder sogar fähig) für normale Arbeit sein. 2) Sie müssen jedoch eine gute Beständigkeit und Reparaturfähigkeit gegen Datenbeschädigung aufweisen. 3) Dies ist häufig nützlich wenn sie für inkrementelle Sicherungen leicht zu unterscheiden sind, während dies bei Kopien kein Ziel ist.
Peterh - Wiedereinsetzung Monica
3
Beachten Sie, dass weder git bundleoder git clonebekommt alles , zum Beispiel des Hook - Scripts.
Zitrax
2
@ Zitrax Ja, es ist beabsichtigt. Haken können gefährlich sein oder vertrauliche Informationen enthalten.
VonC
Kann ich git bundlegegen ein Remote-Repo verwenden?
Ryan Shillington
24

Um einige andere Antworten zu erweitern, mache ich Folgendes:

Richten Sie das Repo ein: git clone --mirror user@server:/url-to-repo.git

Wenn Sie dann die Sicherung aktualisieren möchten: git remote updatevom Klonspeicherort.

Dadurch werden alle Zweige und Tags gesichert, einschließlich neuer Zweige, die später hinzugefügt werden. Beachten Sie jedoch, dass Zweige, die gelöscht werden, nicht aus dem Klon gelöscht werden (was für eine Sicherung eine gute Sache sein kann).

Dies ist atomar, hat also nicht die Probleme, die eine einfache Kopie hätte.

Siehe http://www.garron.me/en/bits/backup-git-bare-repo.html

fantastisch
quelle
20

Erweiterung der großartigen Antworten von KingCrunch und VonC

Ich habe beide kombiniert:

git clone --mirror [email protected]/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all

Danach haben Sie eine Datei namens aufgerufen reponame.bundle, die leicht kopiert werden kann. Sie können dann mit diesem ein neues normales Git-Repository erstellen git clone reponame.bundle reponame.

Beachten Sie, dass git bundlenur Commits kopiert werden, die zu einem Verweis (Zweig oder Tag) im Repository führen. Tangling Commits werden also nicht im Bundle gespeichert.

Kimmo Ahokas
quelle
1
Gute Zusammenfassung. +1.
VonC
2
Ich denke du meintest git bundle create reponame.bundle --all?
Joe
Danke @joe, dass du das bemerkt hast. Bestimmt. Ich werde die Antwort aktualisieren.
Kimmo Ahokas
4

Alles ist im .gitVerzeichnis enthalten. Sichern Sie das einfach zusammen mit Ihrem Projekt wie jede andere Datei.

Oren Hizkiya
quelle
2
Bedeutet dies, dass es ausreicht, nur ALLE Inhalte des Verzeichnisses zu sichern, das das Git-Projekt enthält?
Ravindranath Akila
1
Mit Sunil einverstanden - dies scheint keine atomare Operation zu sein.
Jia103
1
Und wie stellen Sie sicher, dass beim Erstellen der Sicherung keine Änderungen an den Dateien in diesem Verzeichnis vorgenommen werden?
Raedwald
Wie Raedwald angedeutet hat, kann diese Methode zu einer inkonsistenten Sicherung führen und somit zu Datenverlust führen. Daher sollte diese Antwort entfernt werden oder zumindest vor der Möglichkeit eines Datenverlusts gewarnt werden.
Abhishek Anand
Ich denke, er kennt das copyoder cpbefiehlt sehr gut und es passt nicht zu seinen Bedürfnissen. Und ich denke auch, er denkt an ein nacktes Repository (obwohl es auch kopiert werden kann, denke ich, dass es kein Backup mit vollem Funktionsumfang ist).
Peter - Wiedereinsetzung Monica
4

Verwenden Sie ein Git-Bundle oder einen Klon

Das Kopieren des Git-Verzeichnisses ist keine gute Lösung, da es nicht atomar ist. Wenn Sie ein großes Repository haben, dessen Kopieren lange dauert und jemand in Ihr Repository pusht, wirkt sich dies auf Ihre Sicherung aus. Das Klonen oder Erstellen eines Bundles hat dieses Problem nicht.

Sunil Khiatani
quelle
3

Sie können das Git-Repo mit Git-Copy bei minimaler Speichergröße sichern .

git copy /path/to/project /backup/project.repo.backup

Dann können Sie Ihr Projekt mit wiederherstellen git clone

git clone /backup/project.repo.backup project
Quanlong
quelle
2
github.com/cybertk/git-copy/blob/master/bin/git-copy#L8-L36 : das scheint eine Menge Arbeit für ein einfaches git clone --bare+ zu sein git push --force.
VonC
@VonC Ja, aber es kann während des Umpackens einige zusätzliche Funktionen haben, oder es kann die interne Struktur des Git-Repos abbauen, die es für einige Optimierungen (Umstrukturierung des Ziels oder Geschwindigkeitssteigerung usw.) verwenden kann.
Peter - Wiedereinsetzung Monica
3

Die richtige Antwort IMO ist Git Clone - Spiegel . Dadurch wird Ihr Repo vollständig gesichert.

Der Git-Klonspiegel klont das gesamte Repository, Notizen, Köpfe, Verweise usw. und wird normalerweise zum Kopieren eines gesamten Repositorys auf einen neuen Git-Server verwendet. Dadurch werden alle Zweige und alles, das gesamte Repository , heruntergezogen .

git clone --mirror [email protected]/your-repo.git
  • Normalerweise umfasst das Klonen eines Repos nicht alle Zweige, sondern nur den Master.

  • Durch das Kopieren des Repo-Ordners werden nur die eingezogenen Zweige "kopiert". Dies ist also standardmäßig nur der Hauptzweig oder andere Zweige, die Sie zuvor ausgecheckt haben.

  • Der Git-Bundle-Befehl ist auch nicht das, was Sie wollen: "Der Bundle-Befehl packt alles, was normalerweise mit einem Git-Push-Befehl über den Draht geschoben wird, in eine Binärdatei, die Sie per E-Mail an jemanden senden oder auf ein Flash-Laufwerk legen können in ein anderes Repository entbündeln. " (Von Was ist der Unterschied zwischen Git-Klon - Spiegel und Git-Klon - - )

John
quelle
Erstellt git clone --mirror eine konsistente Sicherung zu einem bestimmten Zeitpunkt? Was ist ein Benutzer drückt ein Commit während der Sicherung? Wird es abgelehnt, in die Warteschlange gestellt oder in das Backup aufgenommen?
Benjamin Goodacre
3

Dieser Thread war sehr hilfreich, um einige Einblicke zu erhalten, wie Backups von Git-Repos durchgeführt werden können. Ich denke, es fehlen noch einige Hinweise, Informationen oder Schlussfolgerungen, um den "richtigen Weg" (tm) für sich selbst zu finden. Deshalb teile ich hier meine Gedanken, um anderen zu helfen und sie für Diskussionen vorzubereiten, um sie zu verbessern. Vielen Dank.

Beginnen Sie also mit der Aufnahme der ursprünglichen Frage:

  • Ziel ist es, einer "vollständigen" Sicherung eines Git-Repositorys so nahe wie möglich zu kommen.

Dann bereichern Sie es mit den typischen Wünschen und spezifizieren einige Voreinstellungen:

  • Eine Sicherung über eine "Hot-Copy" wird bevorzugt, um Ausfallzeiten des Dienstes zu vermeiden.
  • Mängel von Git werden durch zusätzliche Befehle behoben.
  • Ein Skript sollte die Sicherung durchführen, um die mehreren Schritte für eine einzelne Sicherung zu kombinieren und menschliche Fehler (Tippfehler usw.) zu vermeiden.
  • Zusätzlich sollte ein Skript die Wiederherstellung durchführen, um den Speicherauszug an den Zielcomputer anzupassen, z. B. hat sich möglicherweise sogar die Konfiguration des ursprünglichen Computers seit der Sicherung geändert.
  • Environment ist ein Git-Server auf einem Linux-Computer mit einem Dateisystem, das Hardlinks unterstützt.

1. Was ist ein "vollständiges" Git-Repo-Backup?

Die Sichtweise unterscheidet sich darin, was eine "100%" Sicherung ist. Hier sind zwei typische.

# 1 Standpunkt des Entwicklers

  • Inhalt
  • Verweise

git ist ein Entwicklertool und unterstützt diesen Standpunkt über git clone --mirrorund git bundle --all.

# 2 Standpunkt des Administrators

  • Inhaltsdateien
    • Sonderfall "packfile": git kombiniert und komprimiert Objekte während der Speicherbereinigung zu packfiles (siehe git gc)
  • Git-Konfiguration
  • Optional: Betriebssystemkonfiguration (Dateisystemberechtigungen usw.)

git ist ein Entwicklertool und überlässt dies dem Administrator. Die Sicherung der Git-Konfiguration und der Betriebssystemkonfiguration sollte als von der Sicherung des Inhalts getrennt angesehen werden.

2. Techniken

  • "Kaltkopie"
    • Beenden Sie den Dienst, um exklusiven Zugriff auf seine Dateien zu erhalten. Ausfallzeit!
  • "Hot-Copy"
    • Der Dienst bietet einen festen Status für Sicherungszwecke. Laufende Änderungen wirken sich nicht auf diesen Status aus.

3. Andere Themen zum Nachdenken

Die meisten von ihnen sind generisch für Backups.

  • Ist genügend Speicherplatz für die vollständigen Sicherungen vorhanden? Wie viele Generationen werden gespeichert?
  • Ist ein inkrementeller Ansatz erwünscht? Wie viele Generationen werden gespeichert und wann muss erneut ein vollständiges Backup erstellt werden?
  • Wie kann ich überprüfen, ob ein Backup nach der Erstellung oder im Laufe der Zeit nicht beschädigt ist?
  • Unterstützt das Dateisystem Hardlinks?
  • Backup in eine einzelne Archivdatei legen oder Verzeichnisstruktur verwenden?

4. Was bietet git zum Sichern von Inhalten?

  • git gc --auto

    • docs: man git-gc
    • Bereinigt und komprimiert ein Repository.
  • git bundle --all

    • docs: man git-bundle, man git-rev-list
    • Atomic = "Hot-Copy"
    • Bundles sind Dump-Dateien und können direkt mit git verwendet werden (Verifizieren, Klonen usw.).
    • Unterstützt die inkrementelle Extraktion.
    • Überprüfbar über git bundle verify.
  • git clone --mirror

    • docs: man git-clone, man git-fsck, Was ist der Unterschied zwischen git clone --mirror und git clone --bare?
    • Atomic = "Hot-Copy"
    • Spiegel sind echte Git-Repositories.
    • Die Hauptabsicht dieses Befehls besteht darin, einen vollständig aktiven Spiegel zu erstellen, der regelmäßig Aktualisierungen aus dem ursprünglichen Repository abruft.
    • Unterstützt Hardlinks für Spiegel im selben Dateisystem, um Platzverschwendung zu vermeiden.
    • Überprüfbar über git fsck.
    • Spiegel können als Grundlage für ein vollständiges Dateisicherungsskript verwendet werden.

5. Kaltkopie

Eine Cold-Copy-Sicherung kann immer eine vollständige Dateisicherung durchführen: Verweigern Sie alle Zugriffe auf die Git-Repos, führen Sie eine Sicherung durch und lassen Sie die Zugriffe erneut zu.

  • Mögliche Probleme
    • Möglicherweise ist es nicht einfach oder sogar möglich, alle Zugriffe zu verweigern, z. B. den gemeinsamen Zugriff über das Dateisystem.
    • Selbst wenn sich das Repo auf einem Nur-Client-Computer mit einem einzelnen Benutzer befindet, kann der Benutzer während eines automatisierten Sicherungslaufs dennoch etwas festschreiben :(
    • Ausfallzeiten auf dem Server sind möglicherweise nicht akzeptabel, und das Sichern mehrerer großer Repos kann lange dauern.
  • Ideen zur Schadensminderung:
    • Verhindern Sie im Allgemeinen den direkten Repo-Zugriff über das Dateisystem, auch wenn sich Clients auf demselben Computer befinden.
    • Verwenden Sie für den SSH / HTTP-Zugriff Git-Autorisierungsmanager (z. B. Capitolit), um den Zugriff dynamisch zu verwalten oder Authentifizierungsdateien per Skript zu ändern.
    • Backup-Repos einzeln, um Ausfallzeiten für jedes Repo zu reduzieren. Verweigern Sie ein Repo, führen Sie eine Sicherung durch und erlauben Sie den Zugriff erneut. Fahren Sie dann mit dem nächsten Repo fort.
    • Planen Sie einen Wartungsplan, um Entwickler nicht zu verärgern.
    • Nur sichern, wenn sich das Repository geändert hat. Möglicherweise sehr schwer zu implementieren, z. B. Liste von Objekten sowie Berücksichtigung von Paketdateien, Prüfsummen für Konfiguration und Hooks usw.

6. Hot-Copy

Dateisicherungen können mit aktiven Repos nicht durchgeführt werden, da das Risiko besteht, dass Daten durch laufende Commits beschädigt werden. Eine Hot-Copy bietet einen festen Status eines aktiven Repositorys für Sicherungszwecke. Laufende Commits wirken sich nicht auf diese Kopie aus. Wie oben aufgeführt, unterstützen die Klon- und Bundle-Funktionen von git dies, aber für eine "100% Admin" -Sicherung müssen einige Dinge über zusätzliche Befehle erledigt werden.

Hot-Copy-Backup "100% admin"

  • Option 1: Verwenden Sie diese Option git bundle --all, um vollständige / inkrementelle Dump-Dateien mit Inhalten zu erstellen und Konfigurationsdateien separat zu kopieren / sichern.
  • Option 2: Verwenden git clone --mirror, behandeln und kopieren Sie die Konfiguration separat und führen Sie dann eine vollständige Dateisicherung des Spiegels durch.
    • Anmerkungen:
    • Ein Spiegel ist ein neues Repository, das bei der Erstellung mit der aktuellen Git-Vorlage gefüllt wird.
    • Bereinigen Sie Konfigurationsdateien und Verzeichnisse und kopieren Sie dann Konfigurationsdateien aus dem ursprünglichen Quellrepository.
    • Das Sicherungsskript kann auch Betriebssystemkonfigurationen wie Dateiberechtigungen auf dem Spiegel anwenden.
    • Verwenden Sie ein Dateisystem, das Hardlinks unterstützt, und erstellen Sie den Spiegel auf demselben Dateisystem wie das Quellrepository, um die Geschwindigkeit zu erhöhen und den Speicherplatzverbrauch während der Sicherung zu verringern.

7. Wiederherstellen

  • Überprüfen und übernehmen Sie die Git-Konfiguration für den Zielcomputer und die neueste "Vorgehensweise" -Philosophie.
  • Überprüfen und übernehmen Sie die Betriebssystemkonfiguration für den Zielcomputer und die neueste "Vorgehensweise" -Philosophie.
Maddes
quelle
0
cd /path/to/backupdir/
git clone /path/to/repo
cd /path/to/repo
git remote add backup /path/to/backupdir
git push --set-upstream backup master

Dadurch wird ein Backup erstellt und das Setup durchgeführt, sodass Sie einen Git-Push ausführen können, um Ihr Backup zu aktualisieren. Was möchten Sie wahrscheinlich tun? Stellen Sie einfach sicher, dass / path / to / backupdir und / path / to / repo mindestens unterschiedliche Festplatten sind, da dies sonst nicht so sinnvoll ist.

Arne
quelle
Ich denke, er kennt den Klonbefehl gut, wenn er eine solche Frage stellen kann, und es ist eindeutig nicht genug für ihn (weil es ein Klon und kein Dump ist). Dumps sind verschiedene Dinge wie einfache Kopien, zum Beispiel: 1) Sie müssen nicht optimal (oder sogar fähig) für normale Arbeit sein. 2) Sie müssen jedoch eine gute Beständigkeit und Reparaturfähigkeit gegen Datenbeschädigung aufweisen. 3) Dies ist häufig nützlich wenn sie für inkrementelle Sicherungen leicht zu unterscheiden sind, während dies bei Kopien kein Ziel ist.
Peter - Wiedereinstellung Monica
0

Hier sind zwei Möglichkeiten:

  1. Sie können direkt einen Teer des Git-Repo-Verzeichnisses nehmen, da es den gesamten Inhalt des Repos auf dem Server enthält. Es besteht eine geringe Wahrscheinlichkeit, dass jemand an einem Repo arbeitet, während er ein Backup erstellt.

  2. Mit dem folgenden Befehl erhalten Sie den nackten Repo-Klon (genau wie auf dem Server). Anschließend können Sie ohne Probleme einen Teer des Speicherorts abrufen, an dem Sie geklont haben.

    git clone --bare {your backup local repo} {new location where you want to clone}
    
Vishal Sahasrabuddhe
quelle
Ich denke, er kennt den Klon- oder Teerbefehl gut, wenn er eine solche Frage stellen kann, und es ist eindeutig nicht genug für ihn (weil es ein Klon und kein Dump ist). Dumps sind verschiedene Dinge wie einfache Kopien, zum Beispiel: 1) Sie müssen nicht optimal (oder sogar fähig) für normale Arbeit sein. 2) Sie müssen jedoch eine gute Beständigkeit und Reparaturfähigkeit gegen Datenbeschädigung aufweisen. 3) Dies ist häufig nützlich wenn sie für inkrementelle Sicherungen leicht zu unterscheiden sind, während dies bei Kopien kein Ziel ist.
Peterh - Wiedereinsetzung Monica
3
Peter, definitiv hat er nicht nach einem Teer- oder Klonbefehl gefragt. Wenn Sie genau hinschauen, habe ich diesen Befehl auch nicht erklärt. Was ich zu erklären versuchte, ist das Git-Backup über eine andere Methode, die verschiedene Linux-Befehle enthalten kann, was nicht bedeutet, dass ich diese Linux-Befehle unterrichte. Ich versuche hier einige Ideen einzubringen.
Vishal Sahasrabuddhe
0

Wenn es sich um Github handelt, navigieren Sie zu Bitbucket und verwenden Sie die Methode "Repository importieren", um Ihr Github-Repo als privates Repo zu importieren.

Wenn es in Bitbucket ist, machen Sie das Gegenteil.

Es ist ein vollständiges Backup, bleibt aber in der Cloud, was meine ideale Methode ist.

Mohammad
quelle
-7

Soweit ich weiß, können Sie einfach eine Kopie des Verzeichnisses erstellen, in dem sich Ihr Repo befindet, das war's!

cp -r project project-backup
Richard Tuin
quelle
Kann jemand dies bitte bestätigen? Ich halte dies für den richtigen Ansatz, um ein ordnungsgemäßes Backup zu erstellen.
Ravindranath Akila
5
Ich denke, Sie könnten einen inkonsistenten Snapshot erhalten, wenn während des Kopiervorgangs Änderungen festgeschrieben / in das Repository übertragen werden. Wenn Sie git-Befehle wie verwenden git clone --bare, erhalten Sie einen konsistenten Schnappschuss.
Eelke
1
Mit Sunil einverstanden - dies scheint nicht atomar zu sein.
Jia103
1
@ jia103 Es ist nicht immer ein Problem, wenn es nicht atomar ist - Sie müssen nur wissen und müssen in der Lage sein, sicherzustellen, dass niemand anderes das Repo erreichen kann, während Sie daran arbeiten. Aber ich denke, das OP möchte ein spezielles, für Git Repos optimiertes Tool für die Aufgabe, eine einfache Dateikopie ist wahrscheinlich für ihn bekannt.
Peter - Wiedereinsetzung Monica