如何从存储库克隆并使用git带来所有远程分支?

时间:2018-10-11 11:17:54

标签: git version-control dvcs git-clone

我有存储库'A',我使用 git clone http://example/A.git 从它克隆到存储库'B'。 因此,现在,我有一个本地分支“ master”,而所有其他分支都作为“ B”中的远程分支。

下一步,我想使用 git clone --bare 从'B'克隆到新的存储库'C',并将所有远程分支从'B ”,并将其设置为“ C”本地。

Image of My Workflow

2 个答案:

答案 0 :(得分:0)

只需将B复制到C

然后运行

git branch -a

查看所有隐藏的分支

您可以在此答案中看到完整的详细信息:

How to clone all remote branches in Git?

答案 1 :(得分:0)

您可以创建镜像克隆,但是镜像克隆是裸克隆(有充分的理由)。那就是:

[host B] git clone --mirror http://example/A.git

在B上生成镜像克隆,您现在可以从git clone --bareBC

[host C] git clone --bare <url of B.git>

B上的镜像克隆将包含A给出的 all 引用,而C上的裸克隆将仅包含A给出的 branch和tag 引用。如果存储库A具有引用refs/heads/masterrefs/heads/developrefs/remotes/origin/masterrefs/replace/a23456789a23456789a23456789a23456789refs/tags/v1.0,则B上的镜像具有所有这些相同的引用,而裸克隆C上缺少refs/remotes/origin/masterrefs/replace/...引用。

在每个克隆之后的任何时候,您都可以在克隆内创建refs/heads/引用。因此,如果您要在B上放置一个非裸露的存储库,则可以将 middle 步骤替换为:

[host B] git clone http://example/A.git

之后是一系列git update-ref(对于任意参考名称)或git branch(对于refs/heads/*参考名称)操作。但是请注意,此时B克隆既未复制A的refs/remotes/origin/master也未复制A的refs/replace/...引用。 B有:

  • A的refs/heads/master,B现在将其称为refs/remotes/origin/master
  • A的refs/heads/develop,B现在将其称为refs/remotes/origin/develop
  • A的refs/tags/v1.0,B称之为refs/tags/v1.0

也就是说,B复制了A的refs/heads/*(分支)引用,但是将它们重命名远程跟踪名称,而不是分支名称。 B复制了A的标签,未更改任何名称。

作为克隆操作的最后一步,B运行了git checkout master(如果A告诉它使用git checkout develop,则可能运行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

您可以用自己喜欢的任何一种编程语言来表达。

这里令人烦恼的是,对于{{1}末尾的git checkout步骤已经创建 的一个分支,“创建分支”步骤将失败。 }}。为避免烦恼,请检查并跳过该分支,或使用git clone避免创建分支并在git clone --no-checkout上填充索引和工作树。

摘要

  • 如果要在B上克隆,可以选择使用B。您将获得所有参考。
  • 如果要在B上进行裸克隆而不是镜像,请使用--mirror。您将获得所有分支和标签引用。
  • 如果要在B上克隆非裸,则必须更加努力(见上文)。

为C重复此操作。

相关问题