В чем разница между git clone --mirror и git clone --bare


486

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

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

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


3
полезно, но если вы также хотите перенести это зеркало в удаленный репозиторий, такой как github, я нашел эту ссылку удобной.
Ешьте в Joes

Ответы:


569

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


Под "нормальным клоном" подразумевается клон без флагов --bare или --mirror?
Сэм

1
Да, это так. С голым клоном, как сказано на странице руководства, ветки также копируются напрямую (без ссылок / удаленных / источника, без отслеживания). Отредактировано в.
Каскабель

Можете ли вы добавить еще один пример использования различий, а не только внутренних различий?
cmcginty

@Casey это то, что вы искали? Я не думал, что то, что я первоначально написал, было «внутренним» вообще - теги и ветви - это очень много фарфоровых элементов.
Каскабель

Означает ли "скопированные ветви как есть", что ветви клонируются по одному и тому же относительному пути? Или это означает, что ветви каким-то образом трансформируются?
Сэм

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


4
Я полагаю, что вы должны следовать git fetchза этим, чтобы он действительно был идентичен. Во всяком случае, это своего рода не ответ - суть вопроса в том, "как зеркало удаленное / клон отличается от обычного?"
Каскабель

6
Мне действительно нравится этот способ демонстрации разницы. Надеюсь, это точно! Я надеюсь, что hfs добавляет команду fetch.
Joeytwiddle

не совсем понятно, например, на что переводится $ (basename $ URL) и т. д.
Kzqai

5
basenameэто обычная утилита unix, которая удаляет часть пути в каталоге и $()является просто подстановкой команд bash.
Виктор Заманян

6
Это все еще имеет --mirrorв этом. Это будет только приемлемый ответ, если он объяснит, что git remote add --mirrorделает.
Zenexer

24

Мои сегодняшние тесты с 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

14

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

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


1
Спасибо; это прояснило для меня, что локальные теги будут перезаписаны так же, как и ветки, с использованием зеркального клона. Очень полезно.
Wildcard

2
Вы также можете использовать --pruneпри запуске git fetch для удаления локальных ссылок, которых больше нет на удаленном компьютере.
17

13

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

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

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


12

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


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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.