Какая разница между git clone --mirror и git clone --bare

На странице справки clone git говорится об этом --mirror:

Настройте зеркало удаленного репозитория. Отсюда следует --bare.

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

Ответ 1

Разница в том, что при использовании --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 все ссылки будут перезаписаны из источника, как если бы вы просто удалили зеркало и отозвали его. Как первоначально сказали документы, это зеркало. Предполагается, что это функционально идентичная копия, взаимозаменяемая с оригиналом.

Ответ 2

$ 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 в целевом хранилище.

Ответ 3

Мои тесты с 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

Ответ 4

Клон копирует ссылки на удаленный доступ и записывает их в подкаталог с именем "это ссылки на удаленный доступ".

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

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