Gibt es eine einfache Möglichkeit, ein gesamtes Git-Repo einschließlich aller Zweige und Tags zu sichern?
Gibt es eine einfache Möglichkeit, ein gesamtes Git-Repo einschließlich aller Zweige und Tags zu sichern?
Antworten:
Was ist mit einem Klon daraus?
git clone --mirror other/repo.git
Jedes Repository ist eine Sicherung seiner Fernbedienung.
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.
git clone
deckt 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 clone
bereits 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.
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 bundle
verpackt 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
git bundle
ist 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.
git bundle
oder git clone
bekommt alles , zum Beispiel des Hook - Scripts.
git bundle
gegen ein Remote-Repo verwenden?
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 update
vom 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
Erweiterung der großartigen Antworten von KingCrunch und VonC
Ich habe beide kombiniert:
git clone --mirror git@some.origin/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 bundle
nur Commits kopiert werden, die zu einem Verweis (Zweig oder Tag) im Repository führen. Tangling Commits werden also nicht im Bundle gespeichert.
git bundle create reponame.bundle --all
?
Alles ist im .git
Verzeichnis enthalten. Sichern Sie das einfach zusammen mit Ihrem Projekt wie jede andere Datei.
copy
oder cp
befiehlt 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).
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.
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
git clone --bare
+ zu sein git push --force
.
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 git@example.com/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 - - )
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:
Dann bereichern Sie es mit den typischen Wünschen und spezifizieren einige Voreinstellungen:
Die Sichtweise unterscheidet sich darin, was eine "100%" Sicherung ist. Hier sind zwei typische.
git ist ein Entwicklertool und unterstützt diesen Standpunkt über git clone --mirror
und git bundle --all
.
git gc
)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.
Die meisten von ihnen sind generisch für Backups.
git gc --auto
git bundle --all
git bundle verify
.git clone --mirror
git fsck
.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.
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.
git bundle --all
, um vollständige / inkrementelle Dump-Dateien mit Inhalten zu erstellen und Konfigurationsdateien separat zu kopieren / sichern.git clone --mirror
, behandeln und kopieren Sie die Konfiguration separat und führen Sie dann eine vollständige Dateisicherung des Spiegels durch.
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.
Hier sind zwei Möglichkeiten:
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.
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}
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.
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
git clone --bare
, erhalten Sie einen konsistenten Schnappschuss.