На довідковій сторінці довідки про клонування Git можна сказати про --mirror
:
Налаштуйте дзеркало віддаленого сховища. Це означає
--bare
.
Але не вникає в деталі про те, чим --mirror
клон відрізняється від --bare
клону.
На довідковій сторінці довідки про клонування Git можна сказати про --mirror
:
Налаштуйте дзеркало віддаленого сховища. Це означає
--bare
.
Але не вникає в деталі про те, чим --mirror
клон відрізняється від --bare
клону.
Відповіді:
Різниця полягає в тому, що при використанні --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
всі рефлекси, вони будуть перезаписані з походження, як якщо б ви просто видалили дзеркало і повернули його. Як спочатку говорили документи, це дзеркало. Це повинна бути функціонально однакова копія, взаємозамінна з оригіналом.
$ git clone --mirror $URL
є короткою рукою для
$ git clone --bare $URL
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL)
(Скопійовано прямо звідси )
Як викладається поточна сторінка:
Порівняно з тим
--bare
, що--mirror
не лише відображає локальні гілки джерела на локальні гілки цілі, він відображає всі рефлексивні дані (включаючи віддалені гілки, нотатки тощо) і встановлює конфігурацію refspec таким чином, що всі ці посилання перезаписуютьсяgit remote update
в цільовому сховищі .
git fetch
щоб він насправді був ідентичним. Так чи інакше, це невідповідь - суть питання в тому, "чим дзеркальний пульт / клон відрізняється від звичайного?"
basename
- це звичайна утиліта unix, яка знімає частину каталогу в шляху, і $()
є просто підстановою команд bash.
--mirror
в ньому. Це було б прийнятною відповіддю лише в тому випадку, якщо вона пояснила б, що git remote add --mirror
робить.
Сьогодні мої тести з 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
Нюансове пояснення з документації GitHub щодо копіювання сховища :
Як і у випадку з голим клоном, дзеркальний клон включає всі віддалені гілки та теги, але всі локальні посилання будуть перезаписані щоразу, коли ви отримуєте його, тому він завжди буде таким же, як у вихідному сховищі.
--prune
під час запуску git fetch для видалення локальних посилань, які більше не знаходяться на пульті.
Клон копіює рефлекси з віддаленого пристрою і вводить їх у підкаталог з назвою "це рефлекси, які має віддалений".
Дзеркало копіює рефлекси із віддаленого пристрою і ставить їх на власний верхній рівень - він замінює власні рефлексивні дані на віддалені.
Це означає, що коли хтось витягне з вашого дзеркала і заповнить свої дзеркала у свою підкаталогію, вони отримають ті самі відгуки, що й у оригіналі. Результат отримання із сучасного дзеркала є таким самим, як отримання безпосередньо з початкового репо.
$ git clone --bare https://github.com/example
Ця команда зробить новий сам $ GIT_DIR. Крім того, головки гілок на пульті копіюються безпосередньо у відповідні місцеві гілки гілок, не відображаючи їх. Якщо використовується ця опція, не створюються ані гілки віддаленого відстеження, ані відповідні змінні конфігурації.
$ git clone --mirror https://github.com/example
Як і у випадку з голим клоном, дзеркальний клон включає всі віддалені гілки та теги, але всі локальні посилання (включаючи гілки віддаленого відстеження, нотатки тощо) будуть перезаписані щоразу, коли ви отримуєте його, тому він завжди буде таким же, як у вихідному сховищі .