В чем разница между 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 на дублирование репозитория:

как и с голым клоном, зеркальный клон включает в себя все удаленные ветви и теги, но все локальные ссылки будут перезаписываться каждый раз, когда вы получаете, поэтому он всегда будет таким же, как и исходный репозиторий.


добавляю картинку, показываю configразницу между зеркалом и голой. enter image description here Левая голая, правая-зеркальная. Вы можете быть ясны, конфигурационный файл mirror имеет fetch ключ, что означает, что вы можете обновить его, по git remote update или git fetch --all