簡體   English   中英

如何從存儲庫克隆並使用git帶來所有遠程分支?

[英]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'的本地分支。

我的工作流程圖片

只需將B復制到C

並運行

git branch -a

查看所有隱藏的分支

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

如何在Git中克隆所有遠程分支?

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

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

在B上生成鏡像克隆,您現在可以執行git clone --bareBC

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

B上的鏡像克隆將包含A給出的所有引用,而C上的裸克隆將僅包含來自A的分支和標記引用。也就是說,如果存儲庫A的引用為refs/heads/masterrefs/heads/developrefs/remotes/origin/masterrefs/replace/a23456789a23456789a23456789a23456789refs/tags/v1.0 ,B上的鏡像具有所有這些相同的引用,而C上的裸克隆缺少refs/remotes/origin/masterrefs/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有:

  • 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 (或者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上填充索引和工作樹。

摘要

  • 如果要在B上進行克隆,則可以使用--mirror 您將獲得所有參考。
  • 如果要在B上裸露克隆而不是鏡像,請使用--bare 您將獲得所有分支和標簽引用。
  • 如果要在B上進行非裸克隆,則必須更加努力(請參見上文)。

對C重復此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM