[英]How to clone from a repository and bring all remote branches using git?
我有存儲庫“ A”,我使用git clone http://example/A.git從它克隆到存儲庫“ B” 。 因此,現在,我有一個本地分支“ master”,而所有其他分支都是“ B”中的遠程分支。
下一步,我想使用git clone --bare從'B'克隆到新的存儲庫'C',並從'B'引入所有遠程分支並將它們作為'C'的本地分支。
您可以創建鏡像克隆,但是鏡像克隆是裸克隆(有充分的理由)。 那是:
[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/
references。 因此,如果您希望在B上放置一個非裸露的存儲庫,則可以將中間步驟替換為:
[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
(或者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 clone
末尾的git checkout
步驟已經創建的一個分支,“ create branch”步驟將失敗。 為了避免煩惱,請檢查並跳過該分支,或者使用git clone --no-checkout
避免創建分支並在B
上填充索引和工作樹。
--mirror
。 您將獲得所有參考。 --bare
。 您將獲得所有分支和標簽引用。 對C重復此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.