710 Stimmen

Was ist der Unterschied zwischen git clone --mirror und git clone --bare

Auf der Hilfeseite von git clone steht folgendes zu lesen --mirror :

Richten Sie einen Spiegel des entfernten Repositorys ein. Dies impliziert --bare .

geht aber nicht im Detail darauf ein, wie die --mirror Klon ist anders als ein --bare Klon.

816voto

Cascabel Punkte 449595

Der Unterschied besteht darin, dass bei der Verwendung von --mirror , alle Refs werden kopiert wie besehen . Das bedeutet alles: Remote-Tracking-Zweige, Notizen, refs/originals/* (Backups von filter-branch). Das geklonte Repository hat alles. Es ist auch so eingerichtet, dass eine Fernaktualisierung alles vom Ursprung zurückholt (und die kopierten Refs überschreibt). Die Idee ist wirklich, das Repository zu spiegeln, um eine vollständige Kopie zu haben, so dass Sie zum Beispiel Ihr zentrales Repository an mehreren Orten hosten können, oder es sichern können. Stellen Sie sich vor, Sie würden das Projektarchiv einfach kopieren, nur eben auf eine viel elegantere Art und Weise.

Die neue Dokumentation sagt so ziemlich alles aus:

--mirror

Richten Sie einen Spiegel des Quell-Repositorys ein. Dies impliziert --bare . Verglichen mit --bare , --mirror ordnet nicht nur die lokalen Zweige der Quelle den lokalen Zweigen des Ziels zu, sondern ordnet auch alle Verweise (einschließlich entfernter Zweige, Notizen usw.) zu und richtet eine refspec-Konfiguration ein, so dass alle diese Verweise durch eine git remote update im Ziel-Repository.

In meiner ursprünglichen Antwort wurde auch auf die Unterschiede zwischen einem Bare Clone und einem normalen (nicht-bare) Clone hingewiesen - der nicht-bare Clone richtet entfernte Verfolgungszweige ein und erstellt nur einen lokalen Zweig für HEAD , während der bloße Klon die Zweige direkt kopiert.

Nehmen wir an, der Ursprung hat ein paar Zweige ( master (HEAD) , next , pu und maint ), einige Tags ( v1 , v2 , v3 ), einige entfernte Zweige ( devA/master , devB/master ), und einige andere Referenzen ( refs/foo/bar , refs/foo/baz (das können Notizen, Verstecke, Namensräume anderer Entwickler sein, wer weiß).

  • git clone origin-url (nicht entblößt): Sie erhalten alle Tags kopiert, einen lokalen Zweig master (HEAD) Verfolgung eines entfernten Zweigs origin/master und abgelegene Zweigstellen origin/next , origin/pu und origin/maint . Die Verfolgungszweige sind so eingerichtet, dass Sie, wenn Sie etwas tun wie git fetch origin werden sie so abgeholt, wie Sie es erwarten. Alle entfernten Zweige (in der geklonten Fernbedienung) und andere Referenzen werden vollständig ignoriert.

  • git clone --bare origin-url : Sie erhalten alle Tags kopiert, lokale Zweige master (HEAD) , next , pu und maint keine Zweigstellen für die Fernüberwachung. Das heißt, alle Zweige werden so kopiert, wie sie sind, und es wird völlig unabhängig eingerichtet, ohne die Erwartung, dass sie wieder geholt werden. Alle entfernten Zweige (in der geklonten entfernten Datei) und andere Verweise werden vollständig ignoriert.

  • git clone --mirror origin-url : Jede einzelne dieser Referenzen wird so kopiert, wie sie ist. Sie erhalten alle Tags, lokale Zweige master (HEAD) , next , pu und maint abgelegene Zweigstellen devA/master y devB/master , andere Verweise refs/foo/bar y refs/foo/baz . Alles ist genau so, wie es in der geklonten Fernbedienung war. Die Fernverfolgung ist so eingerichtet, dass Sie bei der Ausführung von git remote update werden alle Refs vom Ursprung überschrieben, als ob Sie den Mirror einfach gelöscht und neu geklont hätten. Wie in den Dokumenten ursprünglich gesagt wurde, ist es ein Spiegel. Es soll eine funktional identische Kopie sein, die mit dem Original austauschbar ist.

102voto

hfs Punkte 2163
$ git clone --mirror $URL

ist eine Kurzform für

$ git clone --bare $URL
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL)

(Direkt kopiert von aquí )

So steht es auf der aktuellen Man-Page:

Verglichen mit --bare , --mirror ordnet nicht nur die lokalen Zweige der Quelle den lokalen Zweigen des Ziels zu, sondern ordnet auch alle Verweise (einschließlich entfernter Zweige, Notizen usw.) zu und richtet eine refspec-Konfiguration ein, so dass alle diese Verweise durch eine git remote update im Ziel-Repository.

35voto

yanzi1225627 Punkte 783

Ich füge ein Bild hinzu, zeige config Unterschied zwischen Spiegel und nackt. enter image description here Die linke Seite ist kahl, die rechte ist gespiegelt. Sie können sich sicher sein, dass die Konfigurationsdatei des Spiegels fetch Schlüssel, d.h. Sie können ihn aktualisieren, indem Sie git remote update o git fetch --all

28voto

Mark E. Hamilton Punkte 678

Meine heutigen Tests mit git-2.0.0 zeigen, dass die Option --mirror keine Hooks, die Konfigurationsdatei, die Beschreibungsdatei, die info/exclude-Datei und zumindest in meinem Testfall einige Referenzen (die ich nicht verstehe) kopiert. Ich würde es nicht als "funktional identische Kopie, austauschbar mit dem Original" bezeichnen.

-bash-3.2$ git --version
git version 2.0.0
-bash-3.2$ git clone --mirror /git/hooks
Cloning into bare repository 'hooks.git'...
done.

-bash-3.2$ diff --brief -r /git/hooks.git hooks.git
Files /git/hooks.git/config and hooks.git/config differ
Files /git/hooks.git/description and hooks.git/description differ
...
Only in hooks.git/hooks: applypatch-msg.sample
...
Only in /git/hooks.git/hooks: post-receive
...
Files /git/hooks.git/info/exclude and hooks.git/info/exclude differ
...
Files /git/hooks.git/packed-refs and hooks.git/packed-refs differ
Only in /git/hooks.git/refs/heads: fake_branch
Only in /git/hooks.git/refs/heads: master
Only in /git/hooks.git/refs: meta

20voto

Feckmore Punkte 3788

Eine differenzierte Erklärung aus der GitHub-Dokumentation zu Duplizieren eines Repositorys :

Wie bei einem bloßen Klon enthält ein gespiegelter Klon alle entfernten Zweige und Tags, aber alle lokalen Referenzen werden bei jedem Holen überschrieben, so dass er immer mit dem ursprünglichen Repository identisch ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X