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 .

370
demandé sur Steven Penny 2010-10-18 17:59:38

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 un git 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 branche master (HEAD) suivi à distance de la branche origin/master , et les branches distantes origin/next , origin/pu , et origin/maint . Les branches de suivi sont configurées de sorte que si vous faites quelque chose comme git 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 locales master (HEAD) , next , pu et maint , 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 locales master (HEAD) , next , pu , et maint , branches éloignées devA/master et devB/master , autres références refs/foo/bar et refs/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 lancez git 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.

438
répondu Cascabel 2017-07-28 08:20:57
$ 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 un git remote update dans le dépôt cible.

42
répondu hfs 2014-07-06 22:21:16

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
20
répondu Mark E. Hamilton 2014-06-17 18:05:09

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.

11
répondu PaulMurrayCbr 2013-07-12 02:33:47

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.

10
répondu Feckmore 2015-04-27 17:25:15

j'ajoute une image, montrer config différence entre miroir et nu. enter image description here 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

9
répondu yanzi1225627 2016-09-01 08:20:08