Как клонировать из репозитория и перенести все удаленные ветки с помощью git? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть репозиторий 'A', я клонировал его в репозиторий 'B', используя git clone http://example/A.git. Итак, теперь у меня есть одна локальная ветвь "master" и все остальные ветки какудаленные ветви в 'B'.

Следующий шаг, я хочу клонировать из 'B' в новый репозиторий 'C', используя git clone --bare ,и перенести все удаленные ветви из «B» и сделать их локальными в «C».

Изображение моего рабочего процесса

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы можете создать зеркальный клон, но зеркальный клон - это голый клон (по уважительным причинам).То есть:

[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.

0 голосов
/ 11 октября 2018

просто клонируйте B в C

и запустите

git branch -a

, чтобы увидеть все скрытые ветви

Вы можете увидеть полную информацию в этом ответе:

Как клонировать все удаленные ветви в Git?

...