我有存储库'A',我使用 git clone http://example/A.git 从它克隆到存储库'B'。 因此,现在,我有一个本地分支“ master”,而所有其他分支都作为“ B”中的远程分支。
下一步,我想使用 git clone --bare 从'B'克隆到新的存储库'C',并将所有远程分支从'B ”,并将其设置为“ C”本地。
答案 0 :(得分:0)
答案 1 :(得分:0)
您可以创建镜像克隆,但是镜像克隆是裸克隆(有充分的理由)。那就是:
[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给出的 all 引用,而C上的裸克隆将仅包含A给出的 branch和tag 引用。如果存储库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克隆既未复制A的refs/remotes/origin/master
也未复制A的refs/replace/...
引用。 B有:
refs/heads/master
,B现在将其称为refs/remotes/origin/master
refs/heads/develop
,B现在将其称为refs/remotes/origin/develop
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
。您将获得所有参考。--mirror
。您将获得所有分支和标签引用。为C重复此操作。