Quelle est la différence entre le git clone --miroir et le git clone -- nu
la page d'aide de git clone a ceci à dire sur --mirror
:
un miroir du dépôt distant. Cela implique
--bare
.
mais ne va pas en détail sur la façon dont le clone --mirror
est différent d'un clone --bare
.
6 réponses
la différence est que lors de l'utilisation de --mirror
, tous les références sont copiées as-is . Cela signifie tout: branches de suivi à distance, notes, Références / originaux / * (sauvegardes de la branche filtre). Le repo cloné a tout. Il est également configuré de façon à ce qu'une mise à jour à distance récupère tout de l'origine (en écrasant les références copiées). L'idée est vraiment d'avoir un miroir du dépôt, d'avoir une copie totale, de sorte que vous puissiez par exemple héberger votre central repo en plusieurs endroits, ou sauvegarder. Pensez à simplement copier la mise en pension, sauf de manière beaucoup plus élégante.
La nouvelle documentation dit à peu près tout ce qui suit:
--mirror
configurer un miroir du dépôt source. Cela implique
--bare
. Par rapport à--bare
,--mirror
ne fait pas que cartographier les branches locales de la source au niveau local branches de la cible, il mappe toutes les références (y compris les branches distantes, notes, etc.) et met en place une configuration refspec telle que tous ces ref sont écrasés par ungit remote update
dans le dépôt cible.
dans ma réponse originale, J'ai aussi noté les différences entre un clone nu et un clone normal (non nu)-le clone non nu établit des branches de suivi à distance , créant seulement une branche locale pour HEAD
, tandis que le clone nu copie directement les branches.
Suppose que l'origine a quelques branches ( master (HEAD)
, next
, pu
, et maint
), quelques tags ( v1
, v2
, v3
), quelques branches éloignées( devA/master
, devB/master
), et quelques autres réfs ( refs/foo/bar
, refs/foo/baz
, qui pourraient être des notes, des cachettes, d'autres espaces de noms de devs, qui sait).
-
git clone origin-url
(non-bare): vous obtiendrez tous les tags copiés, un local la branchemaster (HEAD)
suivi à distance de la brancheorigin/master
, et les branches distantesorigin/next
,origin/pu
, etorigin/maint
. Les branches de suivi sont configurées de sorte que si vous faites quelque chose commegit fetch origin
, elles seront récupérées comme vous l'attendez. Toutes les branches distantes (dans la télécommande clonée) et autres réf sont complètement ignorées. -
git clone --bare origin-url
: vous obtiendrez toutes les étiquettes copiées, les branches localesmaster (HEAD)
,next
,pu
etmaint
, pas de suivi à distance des branches. C'est-à-dire que toutes les branches sont copiées telles quelles, et elles sont complètement indépendantes, sans aucune attente de reprise. Toutes les branches distantes (dans la télécommande clonée) et autres réf sont complètement ignorées. -
git clone --mirror origin-url
: chacun de ces arbitres sera copié tel quel. Vous aurez toutes les étiquettes, les branches localesmaster (HEAD)
,next
,pu
, etmaint
, branches éloignéesdevA/master
etdevB/master
, autres référencesrefs/foo/bar
etrefs/foo/baz
. Tout est exactement comme dans la télécommande clonée. Le suivi à distance est mis en place de sorte que si vous lancezgit remote update
tous les ref seront écrasés de l'origine, comme si vous aviez juste supprimé le miroir et recloné. Comme les docteurs l'ont dit à l'origine, c'est un miroir. C'est censé être une copie fonctionnellement identique, interchangeable avec l'original.
$ git clone --mirror $URL
est un raccourci pour
$ git clone --bare $URL
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL)
(copié directement de ici )
Comment l'actuel homme-page, le dit:
comparé à
--bare
,--mirror
non seulement cartographie les branches locales de la source aux branches locales de la cible, il cartographie tous les réf (y compris les branches éloignées, notes, etc.) et met en place une configuration refspec telle que tous ces écrasée par ungit remote update
dans le dépôt cible.
mes tests avec git-2.0.0 indiquent aujourd'hui que l'option --mirror ne copie pas les crochets, le fichier de configuration, le fichier de description, le fichier info/exclude, et au moins dans mon cas de test quelques refs (ce que je ne comprends pas.) Je ne dirais pas que c'est une "copie fonctionnellement identique, interchangeable avec l'original."
-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
Un clone copie les refs de la télécommande et les fourre dans un sous-répertoire nommé "ce sont les refs que la distance a'.
un miroir copie les réfs de la télécommande et les met dans son propre niveau supérieur - il remplace ses propres réfs avec ceux de la télécommande.
cela signifie que lorsque quelqu'un tire de votre miroir et stuffs les réfs du miroir dans le sous-répertoire, ils obtiendront les mêmes réfs que ceux qui étaient sur l'original. Le résultat de la récupération à partir d'un miroir à jour est la même chose que la récupération directement à partir de la première mise à jour.
une explication nuancée de la documentation GitHub sur duplication D'un dépôt :
comme pour un clone nu, un clone en miroir inclut toutes les branches et étiquettes distantes, mais toutes les références locales seront écrasées à chaque fois que vous allez chercher, donc il sera toujours le même que le dépôt original.
j'ajoute une image, montrer config
différence entre miroir et nu.
La gauche est nue, la droite est miroir. Vous pouvez être clair, le fichier de configuration de mirror ont fetch
clé, ce qui signifie que vous pouvez le mettre à jour,par git remote update
ou git fetch --all