Wie man ein komplettes Repo bündelt

116

Ich muss ein vollständiges Repo auf einen neuen nicht vernetzten Computer übertragen, vorzugsweise als einzelne Dateieinheit. Das git Bündel ermöglicht einen git fetch, git pullStil Betrieb in einer Umgebung sneakernet scheint aber davon ausgehen , dass Sie bereits eine funktionierende Version des Repo auf der Zielmaschine haben.

Was ist der richtige Aufruf an:

  1. Bündeln Sie alle Filialen im aktuellen Repo
  2. Starten Sie das neue Repo im Zielverzeichnis, dh installieren Sie das Root-Commit korrekt

Ich habe einen Patch stromaufwärts gesendet, um Folgendes zu verdeutlichen:

`git clone` can use any bundle created without negative refspecs
(e.g., `new`, but not `old..new`).
If you want to match `git clone --mirror`, which would clone other
refs such as `refs/remotes/*`, use `--all`.
If you want to provide the same set of refs that a clone directly
from the source repository would get, use `--branches --tags` for
the `<git-rev-list-args>`.

Also am $ git bundle create repo.bundle --branches --tagsbesten zum Klonen passen.

$ git bundle create repo.bundle --all liefert ein Spiegelbild Ihres Quellcomputers, einschließlich der Remote-Refs.

Philip Oakley
quelle

Antworten:

188

Was ist der richtige Aufruf an:

  • Bündeln Sie alle Filialen im aktuellen Repo

Einfach:

$ git bundle create repo.bundle --all

Hier repo.bundleist der Name der Bundle-Datei, die Sie erstellen möchten. Beachten Sie, dass --alldies keine Remote-Tracking-Zweige beinhalten würde ... genau wie gewöhnliche Klone dies auch nicht tun würden.

  • Starten Sie das neue Repo im Zielverzeichnis, dh installieren Sie das Root-Commit korrekt

Erstens cloneist nur init+ fetch(+ administrativia).

Zweitens können Sie die Bundle-Datei überall dort verwenden, wo die Repository-URL verwendet werden kann. Sie können also einfach cloneaus einer Bundle-Datei:

$ git clone repo.bundle

Dies würde repoals Git-Repository erstellt.

Jakub Narębski
quelle
6
Vielen Dank, die --allOptionen sind nicht in meiner Manpage für bundle(ich sehe Version 1.7.6.msysgit.0), noch ist die Verwendung der .bundle-Datei im Abschnitt URLs für clone. Es gibt mir mehr Vertrauen, seine Verwendung zu empfehlen.
Philip Oakley
20
Die Synopse für den Befehl create lautet git bundle create <file> <git-rev-list-args>. Laufen man git-rev-list(oder man git-log) würde dir geben --all. Ich stimme jedoch zu, dass dies in der Dokumentation zum Bundle-Befehl besser sichtbar sein sollte.
Jakub Narębski
1
Ich sehe, dass die Bundle-Manpage unter Angeben von Referenzen angibt, dass "nur Refs verpackt werden, die von angezeigt werden git show-ref", die die Optionen für die Git-Rev-Liste nicht enthalten.
Philip Oakley
2
@Philip Oakley: git-rev-list-argsSo wählen Sie Refs aus, die per git show-refBefehl angezeigt werden .
Jakub Narębski
2
--allhat für mich Remote-Tracking-Zweige enthalten (Git 2.1.4). Ich konnte refs/remotes/origin/*mit git bundle list-heads bundlefileoder sehen git ls-remote bundlefile. Obwohl es wenig schwierig ist, sie aus dem Bundle zurückzubekommen.
Alex
32

Klonen Sie zuerst das Repository und fügen Sie die --mirrorOption hinzu.

git clone --mirror [email protected]:path/repo.git

Dies stellt sicher, dass alle Remote-Verzweigungen auch lokale Zweige sind, die zur Bündelung bereit sind.

Dann renne

git bundle create repo.bundle --all wie in der Antwort von Jakub Narębski beschrieben

thoutbeckers
quelle
3

Ich würde vorschlagen, dass Sie den .git-Ordner tarieren oder komprimieren und ihn einfach am neuen Speicherort auspacken und dann tun git reset --hard HEAD. Alles, was für alle Zweige erforderlich ist, befindet sich unter .git. Sie müssen lediglich alle Fernbedienungen in der .git / config-Datei anpassen oder entfernen.

tar cf myrepo.tgz .git
cp myrepo.tgz [USB_STICK]
... move to new machine ...
mkdir myrepo && cd myrepo
tar xpf [USB_STICK]/myrepo.tgz
git reset --hard HEAD
Patthoyts
quelle
4
Eine Einschränkung ist, dass Sie in der .git / config-Datei nachsehen müssen, ob der ursprüngliche Repo-Besitzer benutzerspezifische Inhalte enthält.
Noufal Ibrahim
@patthoyts: Da es nicht verbunden ist, gibt es keine Fernbedienungen ;-) Es sieht so aus, als ob dem Bundle eine Option fehlt (möglicherweise fehlt) und möglicherweise geklont wird (muss über das Klonen aus einem Bundle nachdenken)
Philip Oakley