На странице справки clone git говорится об этом --mirror
:
Настройте зеркало удаленного репозитория. Отсюда следует
--bare
.
Но не вдаваясь в подробности о том, как клон --mirror
отличается от клона --bare
.
На странице справки clone git говорится об этом --mirror
:
Настройте зеркало удаленного репозитория. Отсюда следует
--bare
.
Но не вдаваясь в подробности о том, как клон --mirror
отличается от клона --bare
.
Разница в том, что при использовании --mirror
все ссылки копируются как есть. Это означает все: удаленное отслеживание веток, заметок, ссылок/оригиналов/* (резервные копии из фильтра-ветки). В клонированном репо есть все. Он также настроен так, что удаленное обновление будет повторно извлекать все из источника (перезаписывая скопированные ссылки). Идея состоит в том, чтобы действительно отразить хранилище, иметь полную копию, чтобы вы могли, например, разместить свое центральное хранилище в нескольких местах или сделать его резервную копию. Подумайте только о прямом копировании репозитория, за исключением гораздо более элегантного мерзавца.
Новая документация в значительной степени говорит обо всем этом:
--mirror
Настройте зеркало исходного хранилища. Это подразумевает
--bare
. По сравнению с--bare
,--mirror
не только сопоставляет локальные ветки источника с локальными ветвями цели, он отображает все ссылки (включая удаленные ветки, заметки и т.д.) И устанавливает конфигурацию refspec таким образом, что все эти ссылки перезаписываются путемgit remote update
в целевом хранилище.
В моем первоначальном ответе также были отмечены различия между пустым клоном и обычным (не голым) клоном - клон, не являющийся голым, устанавливает удаленные отслеживающие ветки, создавая только локальную ветвь для HEAD
, в то время как пустой клон копирует ветки напрямую.
Предположим, у источника есть несколько ветвей (master (HEAD)
, next
, pu
и maint
), некоторые теги (v1
, v2
, v3
), некоторые удаленные ветки (devA/master
, devB/master
) и некоторые другие ссылки (refs/foo/bar
, refs/foo/baz
, которые могут быть заметками, тайниками, пространствами имен других разработчиков, кто знает).
git clone origin-url
(не пустой): вы получите все скопированные теги, локальный master (HEAD)
веток master (HEAD)
отслеживающий удаленную ветку origin/master
, и удаленные ветки origin/next
, origin/pu
и origin/maint
, Ветви трекинга настроены так, что если вы делаете что-то вроде git fetch origin
, они будут выбраны так, как вы ожидаете. Любые удаленные ветки (в клонированном удаленном) и другие ссылки полностью игнорируются.
git clone --bare origin-url
: Вы получите все скопированные теги, master (HEAD)
локальных веток master (HEAD)
, next
, pu
и maint
, без веток удаленного отслеживания. То есть все ветки копируются как есть, и они настроены полностью независимо, без ожидания повторной загрузки. Любые удаленные ветки (в клонированном удаленном) и другие ссылки полностью игнорируются.
git clone --mirror origin-url
: Каждый последний из этих ссылок будет скопирован как есть. Вы получите все теги, master (HEAD)
локальных веток master (HEAD)
, next
, pu
и maint
, удаленные ветки devA/master
и devB/master
, другие ссылки refs/foo/bar
и refs/foo/baz
. Все именно так, как было в клонированном пульте. Удаленное отслеживание настроено так, что если вы запустите git remote update
все ссылки будут перезаписаны из источника, как если бы вы просто удалили зеркало и отозвали его. Как первоначально сказали документы, это зеркало. Предполагается, что это функционально идентичная копия, взаимозаменяемая с оригиналом.
$ git clone --mirror $URL
это сокращение для
$ git clone --bare $URL
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL)
(Скопировано прямо отсюда)
Как это выглядит в текущей man-странице:
По сравнению с
--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
разницу между зеркалом и голой.
Левый голый, справа - зеркало. Вы можете быть чистым, файл конфигурации зеркала имеет ключ fetch
, что означает, что вы можете его обновить, git remote update
или git fetch --all
$ git clone --bare https://github.com/example
Эта команда сама сделает новый $ GIT_DIR. Кроме того, головки веток на удаленном устройстве копируются непосредственно в соответствующие локальные главы ветвей без сопоставления. При использовании этой опции не создаются ни ветки удаленного отслеживания, ни связанные переменные конфигурации.
$ git clone --mirror https://github.com/example
Как и в случае с пустым клоном, зеркальный клон включает все удаленные ветки и теги, но все локальные ссылки (включая ветки с удаленным отслеживанием, заметки и т.д.) Будут перезаписываться при каждой загрузке, поэтому он всегда будет таким же, как и исходный репозиторий.,