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



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




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




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

748   6  

6 ответов:

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

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

--mirror

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

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

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

$ 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

клон копирует ссылки с пульта дистанционного управления и загружает их в подкаталог с именем "это ссылки, которые есть у пульта дистанционного управления".

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

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

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

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

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

Comments

    Ничего не найдено.