La page d'aide de git clone contient ce qui suit --mirror
:
Mettre en place un miroir du dépôt distant. Cela implique que
--bare
.
Mais il n'entre pas dans les détails de la manière dont la --mirror
est différent d'un clone --bare
clone.
La page d'aide de git clone contient ce qui suit --mirror
:
Mettre en place un miroir du dépôt distant. Cela implique que
--bare
.
Mais il n'entre pas dans les détails de la manière dont la --mirror
est différent d'un clone --bare
clone.
La différence est que lors de l'utilisation de --mirror
, a les refs sont copiés en l'état . Cela signifie tout : branches de suivi à distance, notes, refs/originals/* (sauvegardes de filter-branch). Le repo cloné contient tout cela. Il est également configuré pour qu'une mise à jour à distance récupère tout depuis l'origine (en écrasant les refs copiés). L'idée est vraiment de créer un miroir du dépôt, d'avoir une copie totale, de sorte que vous puissiez par exemple héberger votre dépôt central à plusieurs endroits, ou le sauvegarder. Il s'agit d'une copie pure et simple du dépôt, mais d'une manière beaucoup plus élégante que celle de git.
La nouvelle la documentation dit à peu près tout ce qu'il faut savoir :
--mirror
Mettre en place un miroir du dépôt source. Cela implique
--bare
. Par rapport à--bare
,--mirror
ne se contente pas de faire correspondre les branches locales de la source aux branches locales de la cible, il fait correspondre toutes les références (y compris les branches distantes, les notes, etc.) et met en place une configuration refspec telle que toutes ces références sont écrasées par un fichiergit remote update
dans le référentiel cible.
Ma réponse initiale mentionnait également les différences entre un clone nu et un clone normal (non nu) - le clone non nu met en place des branches de suivi à distance, ne créant qu'une branche locale pour le HEAD
tandis que le clone nu copie directement les branches.
Supposons que l'origine ait quelques branches ( master (HEAD)
, next
, pu
y maint
), certains tags ( v1
, v2
, v3
), certaines branches éloignées ( devA/master
, devB/master
), et quelques autres références ( refs/foo/bar
, refs/foo/baz
qui peuvent être des notes, des cachettes, des espaces de noms d'autres développeurs, qui sait).
git clone origin-url
(non dénudé) : Vous obtiendrez toutes les étiquettes copiées, une branche locale master (HEAD)
suivi d'une succursale distante origin/master
et les succursales éloignées origin/next
, origin/pu
y origin/maint
. Les branches de suivi sont configurées de telle sorte que si vous faites quelque chose comme git fetch origin
ils seront recherchés comme vous l'attendez. Les branches distantes (dans le clone distant) et les autres références sont complètement ignorées.
git clone --bare origin-url
: Vous obtiendrez toutes les étiquettes copiées, les branches locales master (HEAD)
, next
, pu
y maint
pas de branches de suivi à distance. En d'autres termes, toutes les branches sont copiées telles quelles, et elles sont configurées de manière totalement indépendante, sans aucune attente de récupération. Toutes les branches distantes (dans la branche distante clonée) et les autres références sont complètement ignorées.
git clone --mirror origin-url
: Tous ces refs seront copiés tels quels. Vous obtiendrez tous les tags, les branches locales master (HEAD)
, next
, pu
y maint
, succursales à distance devA/master
y devB/master
autres références refs/foo/bar
y refs/foo/baz
. Tout est exactement comme dans la télécommande clonée. Le suivi à distance est configuré de telle sorte que si vous exécutez la commande git remote update
toutes les refs seront écrasées à partir de l'origine, comme si vous veniez de supprimer le miroir et de le recloner. Comme l'indique la documentation à l'origine, il s'agit d'un miroir. Il est censé être une copie fonctionnellement identique, interchangeable avec l'original.
Oui, c'est vrai. Avec un clone nu, comme le dit la page de manuel, les branches sont également copiées directement (pas de refs/remotes/origine, pas de suivi). Modifié en.
Pouvez-vous ajouter des exemples d'utilisation de la différence, et pas seulement des différences internes à git ?
$ 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 aquí )
C'est ce que dit la page de manuel actuelle :
Par rapport à
--bare
,--mirror
ne se contente pas de faire correspondre les branches locales de la source aux branches locales de la cible, il fait correspondre toutes les références (y compris les branches distantes, les notes, etc.) et met en place une configuration refspec telle que toutes ces références sont écrasées par un fichiergit remote update
dans le référentiel cible.
Je pense qu'il faut faire suivre cela d'une git fetch
pour qu'ils soient effectivement identiques. Quoi qu'il en soit, il s'agit en quelque sorte d'une non-réponse - le but de la question est de savoir en quoi un miroir éloigné/clone est différent d'un miroir normal.
En fait, j'aime bien cette façon de montrer la différence. J'espère qu'elle est exacte ! J'espère que hfs ajoutera la commande fetch.
Mes tests avec git-2.0.0 aujourd'hui indiquent que l'option --mirror ne copie pas les hooks, le fichier de configuration, le fichier de description, le fichier info/exclude, et au moins dans mon cas de test quelques refs (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
Une explication nuancée tirée de la documentation GitHub sur les Duplication d'un référentiel :
Comme pour un clone nu, un clone miroir inclut toutes les branches et étiquettes distantes, mais toutes les références locales seront écrasées à chaque fois que vous récupérerez le dépôt, de sorte qu'il sera toujours identique au dépôt original.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
6 votes
Utile, mais si vous voulez aussi pousser ce miroir vers un repo distant comme github, j'ai trouvé ce lien pratique.