В чем разница между git clone --mirror и git clone --bare - PullRequest
421 голосов
/ 18 октября 2010

На странице справки git clone есть что сказать о --mirror:

Настройте зеркало удаленного хранилища. Это подразумевает --bare.

Но не будем вдаваться в подробности того, как клон --mirror отличается от клона --bare.

Ответы [ 7 ]

495 голосов
/ 18 октября 2010

Разница в том, что при использовании --mirror, все ссылки копируются как есть . Это означает все: удаленное отслеживание веток, заметок, ссылок / оригиналов / * (резервные копии из фильтра-ветки). В клонированном репо есть все. Он также настроен так, что удаленное обновление будет повторно извлекать все из источника (перезаписывая скопированные ссылки). Идея состоит в том, чтобы действительно отразить хранилище, иметь полную копию, чтобы вы могли, например, разместить свое центральное хранилище в нескольких местах или сделать его резервную копию. Подумайте только о прямом копировании репо, за исключением гораздо более элегантного мерзавца.

Новая документация в значительной степени говорит все это:

--mirror

Настройте зеркало исходного хранилища. Это подразумевает --bare. По сравнению с --bare, --mirror не только отображает локальные ветви источника в локальные ветви цели, но и отображает все ссылки (включая удаленные ветви, заметки и т. Д.) И устанавливает конфигурацию refspec таким образом, что все эти ссылки перезаписываются на git remote update в целевом хранилище.

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

Предположим, у источника есть несколько ветвей (master (HEAD), next, pu и maint), некоторые теги (v1, v2, v3), некоторые удаленные ветви (* 1033) *, 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, то все ссылки будут перезаписаны с начала координат, как если бы вы просто удалили зеркало и отозвали его заново. Как первоначально сказали документы, это зеркало. Предполагается, что это функционально идентичная копия, взаимозаменяемая с оригиналом.

48 голосов
/ 18 октября 2010
$ git clone --mirror $URL

является сокращением для

$ git clone --bare $URL
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL)

(скопировано непосредственно с здесь )

Как это выглядит на текущей странице руководства:

По сравнению с --bare, --mirror не только сопоставляет локальные ветви источника с локальными ветвями цели, он отображает все ссылки (включая удаленные ветви, заметки и т. Д.) И устанавливает конфигурацию refspec.так что все эти ссылки перезаписываются git remote update в целевом хранилище.

23 голосов
/ 17 июня 2014

Мои тесты с 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
12 голосов
/ 01 сентября 2016

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

12 голосов
/ 27 апреля 2015

Подробное объяснение из документации GitHub по Дублирование репозитория :

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

12 голосов
/ 12 июля 2013

Клон копирует ссылки с пульта и помещает их в подкаталог с именем «это ссылки, которые есть у пульта».

Зеркало копирует ссылки с пульта дистанционного управления и помещает их на свой верхний уровень - оно заменяет свои собственные ссылки ссылками пульта дистанционного управления.

Это означает, что когда кто-то вытаскивает из вашего зеркала и помещает ссылки зеркала в свой подкаталог, они получат те же ссылки, что и на оригинале. Результат извлечения из современного зеркала аналогичен извлечению непосредственно из первоначального репо.

2 голосов
/ 09 апреля 2019
$ git clone --bare https://github.com/example

Эта команда сама сделает новый $ GIT_DIR.Кроме того, головки веток на удаленном устройстве копируются непосредственно в соответствующие локальные главы ветвей без сопоставления.При использовании этого параметра не создаются ни ветви удаленного отслеживания, ни связанные переменные конфигурации.

$ git clone --mirror https://github.com/example

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

...