web-dev-qa-db-fra.com

Quelle est la différence entre git clone --mirror et git clone --bare

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.

432
Sam

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 un git 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.

507
Cascabel
$ 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 un git remote update dans le référentiel cible.

48
hfs

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
24
Mark E. Hamilton

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.

12
Feckmore

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.

12
PaulMurrayCbr

J'ajoute une image, affiche config différence entre miroir et nu. enter image description here La gauche est nue, la droite est le miroir. Vous pouvez être clair, le fichier de configuration du miroir a la touche fetch, ce qui signifie que vous pouvez le mettre à jour, par git remote update ou git fetch --all

12
yanzi1225627
$ 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. .

2
Shantanu Singh