Яка різниця між git clone --mirror та git clone --bare


486

На довідковій сторінці довідки про клонування Git можна сказати про --mirror:

Налаштуйте дзеркало віддаленого сховища. Це означає --bare.

Але не вникає в деталі про те, чим --mirrorклон відрізняється від --bareклону.


3
корисно, але якщо ви також хочете перенести це дзеркало до віддаленого репо, як github, я знайшов це посилання зручним.
Їжте у Джоеса

Відповіді:


569

Різниця полягає в тому, що при використанні --mirror, все рефи копіюються як є . Це означає все: віддалене відстеження гілок, примітки, реф / оригінали / * (резервне копіювання з фільтр-гілки). У клонованого репо є все. Він також налаштований так, що віддалене оновлення повторно отримає все від початкового коду (перезаписавши скопійовані рефлекси). Ідея полягає в тому, щоб відобразити сховище, щоб мати повну копію, щоб ви могли, наприклад, розмістити центральне репо в декількох місцях або створити резервну копію. Подумайте просто скопіювати репо-копію, за винятком набагато більш елегантного способу git.

Нова документація майже все це говорить:

--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
Так, це так. З голим клоном, як написано на сторінці man, гілки також копіюються безпосередньо (ніяких реф / віддалень / походження, відстеження немає). Відредаговано.
Каскабель

Чи можете ви додати ще якийсь приклад використання щодо різниці, а не лише внутрішніх відмінностей git?
cmcginty

@Casey це те, що ви шукали? Я не думав, що те, що я спочатку писав, взагалі було "внутрішнім" - теги та гілки - це дуже порцелянові функції.
Каскабель

Чи означає "гілки скопійовані як є" означає, що гілки скопійовані на той самий відносний шлях на клоні? Або це означає, що гілки якимось чином трансформуються?
Сем

56
$ git clone --mirror $URL

є короткою рукою для

$ git clone --bare $URL
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL)

(Скопійовано прямо звідси )

Як викладається поточна сторінка:

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


4
Я вважаю, що вам доведеться слідувати цьому за допомогою того, git fetchщоб він насправді був ідентичним. Так чи інакше, це невідповідь - суть питання в тому, "чим дзеркальний пульт / клон відрізняється від звичайного?"
Каскабель

6
Мені справді подобається такий спосіб демонстрації різниці. Сподіваємось, це точно! Я сподіваюся, що hfs додає команду fetch.
joeytwiddle

не дуже зрозуміло, наприклад, що перекладається на $ (базове ім'я $ URL) тощо
Kzqai

5
basename- це звичайна утиліта unix, яка знімає частину каталогу в шляху, і $()є просто підстановою команд bash.
Віктор Заманян

6
Це все ще є --mirrorв ньому. Це було б прийнятною відповіддю лише в тому випадку, якщо вона пояснила б, що git remote add --mirrorробить.
Зенексер

24

Сьогодні мої тести з git-2.0.0 вказують, що параметр --mirror не копіює гачки, конфігураційний файл, файл опису, файл з інформацією / виключення і, принаймні, в моєму тестовому випадку кілька реф (які я не ' t розумію.) Я б не назвав це "функціонально ідентичною копією, взаємозамінною з оригіналом".

-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 для видалення локальних посилань, які більше не знаходяться на пульті.
нішантс

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.