La page d'aide de git clone a ceci à dire à propos de --mirror
:
Configurez un miroir du référentiel distant. Cela implique
--bare
.
Mais n'entrez pas dans les détails sur la différence entre le clone --mirror
et un clone --bare
.
La différence est que, lorsque vous utilisez --mirror
, , tous les références sont copiés tels quels . Cela signifie tout: branches de suivi à distance, notes, refs/originals/* (sauvegardes à partir de la branche de filtre). Le repo cloné a tout. Il est également configuré de manière à ce qu'une mise à jour à distance extrait de nouveau tous les éléments de l'origine (en remplaçant les références copiées). L’idée est vraiment de refléter le référentiel, d’avoir une copie complète, afin que vous puissiez par exemple héberger votre référentiel central à plusieurs endroits ou le sauvegarder. Pensez simplement à copier le rapport directement, sauf de manière beaucoup plus élégante.
Le nouveau documentation dit à peu près tout cela:
--mirror
Configurez un miroir du référentiel source. Cela implique
--bare
. Par rapport à--bare
,--mirror
mappe non seulement les branches locales de la source sur les branches locales de la cible, mais également toutes les références (y compris les branches distantes, les notes, etc.) et définit une configuration refspec telle que ces références sont écrasées par ungit remote update
dans le référentiel cible.
Ma réponse initiale notait également les différences entre un clone nu et un clone normal (non-nu) - le clone non-nu configurait des branches de suivi distantes, ne créant qu'une branche locale pour HEAD
, tandis que le clone nu copiait le branches directement.
Supposons que Origin ait quelques branches (master (HEAD)
, next
, pu
et maint
), quelques balises (v1
, v2
, v3
) , quelques branches distantes (devA/master
, devB/master
), et quelques autres refs (refs/foo/bar
, refs/foo/baz
, qui peuvent être des notes, des stash, des espaces de noms d'autres développeurs, qui sait) .
git clone Origin-url
(non-nu): Vous obtiendrez toutes les balises copiées, une branche locale master (HEAD)
suivi d'une branche distante 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 prévu. Toutes les branches distantes (dans la télécommande clonée) et les autres références sont complètement ignorées.
git clone --bare Origin-url
: Vous obtiendrez toutes les balises copiées, les branches locales master (HEAD)
, next
, pu
et maint
, pas de branches de suivi à distance. Autrement dit, toutes les branches sont copiées telles quelles et sont configurées de manière totalement indépendante, sans attendre de récupération. Toutes les branches distantes (dans la télécommande clonée) et les autres références sont complètement ignorées.
git clone --mirror Origin-url
: Chaque dernier de ces références sera copié tel quel. Vous obtiendrez toutes les balises, les branches locales master (HEAD)
, next
, pu
et maint
, les branches distantes devA/master
et devB/master
, les 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 configuré pour que, si vous exécutez git remote update
, toutes les références soient écrasées à partir d’Origin, comme si vous veniez de supprimer le miroir et de le recloner. Comme les docs 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 la page de manuel actuelle le dit:
Par rapport à
--bare
,--mirror
mappe non seulement les branches locales de la source sur les branches locales de la cible, il mappe toutes les références (y compris les branches distantes, les notes, etc.) et définit une configuration refspec telle que ces références sont écrasées par ungit remote update
dans le référentiel cible.
Mes tests actuels avec git-2.0.0 indiquent 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 références (que je ne t comprendre.) Je n’appellerais pas cela 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
Une explication nuancée de la documentation de GitHub sur Dupliquer un référentiel :
Comme avec un clone nu, un clone en miroir inclut toutes les branches et balises distantes, mais toutes les références locales seront écrasées à chaque extraction, de sorte que ce sera toujours le même que le référentiel d'origine.
Un clone copie les références de la télécommande et les insère dans un sous-répertoire nommé "ce sont les références de la télécommande".
Un miroir copie les références de la télécommande et les place à son propre niveau supérieur - il remplace ses propres références par celles de la télécommande.
Cela signifie que lorsque quelqu'un tire de votre miroir et place ses références dans leur sous-répertoire, elles obtiendront les mêmes références que celles de l'original. Le résultat de l'extraction à partir d'un miroir à jour est identique à l'extraction directement à partir du référentiel initial.
$ git clone --bare https://github.com/example
Cette commande créera elle-même le $ GIT_DIR. Les têtes de branches distantes sont également copiées directement dans les têtes de branches locales correspondantes, sans correspondance. Lorsque cette option est utilisée, ni les branches de suivi à distance ni les variables de configuration associées ne sont créées.
$ git clone --mirror https://github.com/example
Comme avec un clone nu, un clone en miroir inclut toutes les branches et les balises distantes, mais toutes les références locales (y compris les branches de suivi à distance, les notes, etc.) seront écrasées à chaque fois que vous effectuez une extraction. Ce sera donc toujours le même que le référentiel d'origine. .