Вы можете создать зеркальный клон, но зеркальный клон - это голый клон (по уважительным причинам).То есть:
[host B] git clone --mirror http://example/A.git
создает зеркальный клон на B, и теперь вы можете сделать git clone --bare
с B
до C
:
[host C] git clone --bare <url of B.git>
Зеркальный клон на Bбудет содержать все ссылки, которые дал A, в то время как голый клон на C будет содержать только ссылки и тег от A. То есть, если репозиторий A имеет ссылки refs/heads/master
, refs/heads/develop
, refs/remotes/origin/master
, refs/replace/a23456789a23456789a23456789a23456789
и refs/tags/v1.0
, зеркало на B имеет все те же ссылки, в то время как голый клон на C не имеет ссылок refs/remotes/origin/master
и refs/replace/...
.
ВВ любой точке после каждого клона вы можете создать refs/heads/
ссылки внутри клона.Следовательно, если вы хотите использовать не обнаженное хранилище на B, вы можете заменить шаг middle на:
[host B] git clone http://example/A.git
, за которым следует серия git update-ref
(для произвольных имен ссылок) илиgit branch
(для refs/heads/*
имен ссылок) операции.Но обратите внимание, что клон B на этом этапе не скопировал ни ссылку refs/remotes/origin/master
A, ни ссылку refs/replace/...
A.B имеет:
- A's
refs/heads/master
, который B вызывает refs/remotes/origin/master
сейчас - A's
refs/heads/develop
, который B вызывает refs/remotes/origin/develop
сейчас - A's
refs/tags/v1.0
, который B вызывает refs/tags/v1.0
То есть, B скопировал refs/heads/*
(ветвь) ссылок A, но переименовал , чтобы они были remote-имена отслеживания вместо имен филиалов.B скопировал теги A без каких-либо изменений имени.
В качестве последнего шага своей операции клонирования B запустил git checkout master
(или, возможно, git checkout develop
, если A сказал ему использовать develop
вместо этого).Это создало единственное имя ветви B, refs/heads/master
(или, может быть, refs/heads/develop
) и заполнило индекс и рабочее дерево B.Поэтому, если вы хотите, чтобы B
имел в качестве ветвей все ветви, которые имел A
, это относительно просто:
for all branches that were in A, but are now remote-tracking names in B:
create branch in B using the remote-tracking name we created during the clone
, которую вы можете выразить на любом языке программирования, который вы предпочитаете.
Здесь есть один недостаток, который заключается в том, что шаг «создать ветвь» завершится неудачей для одной ветви, которая была уже , созданной шагом git checkout
в конце git clone
.Чтобы избежать раздражения, либо проверьте и пропустите эту ветвь, либо используйте git clone --no-checkout
, чтобы избежать создания ветки и заполнения индекса и рабочего дерева для B
.
Сводка
- Если вам нужен клон bare на B, можно использовать
--mirror
.Вы получите все ссылки. - Если вам нужен чистый клон на B, но не зеркало, используйте
--bare
.Вы получите все ссылки на ветки и теги. - Если вам нужен клон non-bare на B, вы должны работать усерднее (см. Выше).
Повторите это для C.