В чем разница между git clone -- mirror и git clone --bare
страница справки git clone имеет это сказать о --mirror
:
настройка зеркала удаленного репозитория. Это подразумевает
--bare
.
но не вдается в подробности о том, как --mirror
клон отличается от --bare
клон.
6 ответов
разница в том, что при использовании --mirror
, все ссылки скопировать как есть. Это означает все: удаленные ветви отслеживания, заметки, ссылки / оригиналы/* (резервные копии из filter-branch). У клонированного РЕПО есть все. Он также настроен так, что удаленное обновление будет повторно извлекать все из источника (перезапись скопированных ссылок). Идея заключается в том, чтобы отразить репозиторий, иметь полную копию, чтобы вы могли, например, разместить свое центральное РЕПО в нескольких по местам или назад. Подумайте только о прямом копировании РЕПО, за исключением гораздо более элегантного способа git.
новая документация в значительной степени говорит все это:
--mirror
настройка зеркала исходного репозитория. Это подразумевает
--bare
. По сравнению с--bare
,--mirror
не только отображает локальные ветви источника в локальные ветви цели, он отображает все ссылки (включая удаленные ветви, заметки и т. д.) и устанавливает конфигурация refspec такая, что все эти ссылки перезаписываютсяgit remote update
в целевом хранилище.
мой первоначальный ответ также отметил различия между голым клоном и обычным (не голым) клоном - не-голый клон настраивает удаленные ветви отслеживания, создавая только локальную ветвь для HEAD
, в то время как голый клон копирует ветви напрямую.
предположим, что origin имеет несколько ветвей (master (HEAD)
, next
, pu
и maint
), некоторые теги (v1
, v2
, v3
), некоторые удаленные филиалы (devA/master
, devB/master
), и некоторые другие рефы (refs/foo/bar
, refs/foo/baz
, которые могут быть заметками, тайниками, пространствами имен других разработчиков, кто знает).
git clone origin-url
(не голый): вы получите все теги скопированы, локальная ветвьmaster (HEAD)
отслеживание удаленной веткиorigin/master
, и удаленных филиаловorigin/next
,origin/pu
иorigin/maint
. Ветви отслеживания настроены так, что если вы сделаете что-то вродеgit fetch origin
они будут как вы и ожидали. Любые удаленные ветви (в клонированном удаленном) и другие ссылки полностью игнорируются.git clone --bare origin-url
: вы получите все теги скопированы, локальные ветвиmaster (HEAD)
,next
,pu
иmaint
, отсутствие дистанционных отслеживая ветвей. То есть, все ветви копируются "как есть", и он полностью независимым, без ожидания снова привлекательной. Любые удаленные ветви (в клонированном удаленном) и другие ссылки полностью игнорируемый.git clone --mirror origin-url
: каждый последний из этих ссылок будет скопирован как есть. Вы получите все теги, локальные ветвиmaster (HEAD)
,next
,pu
иmaint
, удаленными филиаламиdevA/master
иdevB/master
, других ссылокrefs/foo/bar
иrefs/foo/baz
. Все точно так же, как было в клонированном пульте. Удаленное отслеживание настроено так, что если вы запуститеgit remote update
все рефы будут перезаписаны из Origin, как если бы ты просто удалил зеркало и recloned его. Как документы первоначально сказал, это зеркало. Предполагается, что это функционально идентичная копия, взаимозаменяемая с оригиналом.
$ git clone --mirror $URL
- это сокращение для
$ git clone --bare $URL
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL)
(скопировано непосредственно из здесь)
как текущий man-page ставит его:
по сравнению с
--bare
,--mirror
не только отображает локальные ветви источника в локальные ветви цели, он отображает все ссылки (включая удаленные ветви, заметки и т. д.) и настраивает конфигурацию refspec таким образом, что все эти ссылки перезаписываютсяgit remote update
в целевом хранилище.
мои тесты с git-2.0.0 сегодня показывают, что параметр --mirror не копирует крючки, файл конфигурации, файл описания, файл info/exclude и, по крайней мере, в моем тестовом случае несколько ссылок (которые я не понимаю.) Я бы не назвал его "функционально идентичной копией, взаимозаменяемой с оригиналом"."
-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
клон копирует ссылки с пульта ДУ и загружает их в подкаталог с именем "это ссылки, которые есть у пульта ДУ".
зеркало копирует ссылки с пульта и помещает их в собственный верхний уровень - он заменяет свои ссылки с пульта.
Это означает, что когда кто-то вытаскивает из вашего зеркала и запихивает refs зеркала в свой подкаталог, они получат те же refs, что и в оригинале. Результат извлечения из современное зеркало-это то же самое, что и извлечение непосредственно из начального РЕПО.
подробное объяснение из документации GitHub на дублирование репозитория:
как и с голым клоном, зеркальный клон включает в себя все удаленные ветви и теги, но все локальные ссылки будут перезаписываться каждый раз, когда вы получаете, поэтому он всегда будет таким же, как и исходный репозиторий.