На странице справки git clone есть что сказать о --mirror
:
Настройте зеркало удаленного хранилища. Это подразумевает
--bare
.
Но не вдаваться в подробности о том, чем --mirror
клон отличается от --bare
клона.
На странице справки git clone есть что сказать о --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)
отслеживания удаленного филиала 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
все ссылки будут перезаписаны с начала координат, как если бы вы просто удалили зеркало и отозвали его заново. Как первоначально сказали документы, это зеркало. Предполагается, что это функционально идентичная копия, взаимозаменяемая с оригиналом.
$ 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 fetch
за этим, чтобы он действительно был идентичен. Во всяком случае, это своего рода не ответ - суть вопроса в том, "как зеркало удаленное / клон отличается от обычного?"
basename
это обычная утилита unix, которая удаляет часть пути в каталоге и $()
является просто подстановкой команд bash.
--mirror
в этом. Это будет только приемлемый ответ, если он объяснит, что git remote add --mirror
делает.
Мои сегодняшние тесты с 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
Подробное объяснение из документации GitHub по дублированию репозитория :
Как и в случае чистого клона, зеркальный клон включает все удаленные ветви и теги, но все локальные ссылки будут перезаписываться при каждом извлечении, поэтому он всегда будет таким же, как и исходный репозиторий.
--prune
при запуске git fetch для удаления локальных ссылок, которых больше нет на удаленном компьютере.
Клон копирует ссылки с удаленного устройства и помещает их в подкаталог с именем «это ссылки, которые есть у удаленного устройства».
Зеркало копирует ссылки с пульта и переводит их на свой верхний уровень - оно заменяет свои ссылки на удаленные.
Это означает, что когда кто-то вытаскивает из вашего зеркала и помещает ссылки на зеркала в свой подкаталог, они получат те же ссылки, что и на оригинале. Результат извлечения из современного зеркала аналогичен извлечению непосредственно из первоначального репо.
$ git clone --bare https://github.com/example
Эта команда сама сделает новый $ GIT_DIR. Кроме того, заголовки веток на удаленном устройстве копируются непосредственно в соответствующие локальные заголовки ветвей без сопоставления. При использовании этой опции не создаются ни ветви удаленного отслеживания, ни связанные переменные конфигурации.
$ git clone --mirror https://github.com/example
Как и в случае чистого клона, зеркальный клон включает в себя все удаленные ветви и теги, но все локальные ссылки (включая ветви с удаленным отслеживанием, заметки и т. Д.) Будут перезаписываться при каждой загрузке, поэтому он всегда будет таким же, как и исходный репозиторий. ,