[英]Git clone a series of branches but not all
使用此命令,它會克隆所有分支,然后最終在指定分支上簽出:
git clone -b <branchname> <remote-repo-url>
使用此命令,僅克隆指定的分支:
git clone -b <branchname> --single-branch <remote-repo-url>
有沒有辦法指定一系列分支來克隆它們,但不必擁有所有分支?
git clone <branchname>, <branchname2>, <branchname3> ??
相似的東西?
這里的訣竅是要意識到,在某種程度上,您首先不會克隆分支。 你克隆提交。 Git 都是關於提交的,所以幾乎你所做的一切都是關於提交的。 也就是說,我們通過分支名稱查找提交——除非你瘋狂到使用原始 hash ID——和git clone
,一旦完成克隆部分或所有提交,創建一個分支名稱,所以它“感覺”你重新克隆一個分支。
使用--single-branch
、 --depth
和新奇的部分克隆功能是一種告訴您的(客戶端)Git不要從您正在克隆的存儲庫中獲取所有提交的方法。 (記住或意識到這里git clone
包括運行mkdir
, git init
, git remote add
, git fetch
,等等;它是復制提交的git fetch
步驟,默認是復制所有提交。 )
在這種情況下您可能想要的是:復制所有提交,然后不創建任何分支名稱。 那是:
git clone --no-checkout <url>
這樣,您將獲得所有提交——以及所有分支的遠程跟蹤名稱——但沒有您自己的分支名稱,也沒有簽出任何提交。 現在您可以輸入新的克隆並為您想要的每個分支名稱的每個遠程跟蹤名稱創建一個分支名稱:
cd new-clone
for b in main feature dev; do git branch --track origin/$b; done
現在您還沒有檢查任何內容,但是您已經將main
、 feature
和dev
都設置為origin/main
、 origin/feature
和origin/dev
作為它們的上游,可以使用了。
您還可以使用:
git clone <url>
cd new-repo
for b in feature dev; do git checkout $b; done && git checkout main\
(假設您想要檢出main
並且這是git clone
將作為其最后一步檢出的內容)。 這效率較低,但計算機效率在這里通常無關緊要:當您的git clone
的git fetch
步驟需要 50 秒來檢索所有提交時,額外的 2 或 3 秒算什么?
請記住:
git checkout something
方法:
git checkout --guess something
(除非你關閉猜測)。 這同樣適用於新奇的git switch
。 --guess
選項說:在你抱怨沒有這樣的分支名稱之前,go 查看我的遠程跟蹤名稱,看看是否有完全匹配的名稱,如果是,請使用提交為我創建一個新的分支名稱由該遠程跟蹤名稱指定,並將遠程跟蹤名稱設置為我的新分支的上游。 2個
換句話說,默認的“猜測”模式意味着:檢查現有分支,或者如果可以的話創建一個新分支。 由於分支名稱並不重要——除了涉及查找提交和保持人類理智時——只要你有正確的提交,Git 就可以為你做這件事。 Git 只真正關心提交。
1更准確地說,默認是復制所有具有分支或標簽或其他通常有用的名稱的提交和標簽。 因此git clone
通常不會復制 GitHub 上的拉取請求提交,這些提交位於特定於 GitHub 的名稱空間下。 它不會從git replace
復制refs/replace/
提交,也不會復制僅通過refs/stash
或其他特殊名稱找到的提交。 但對於第一個近似值,默認值是“獲取所有提交”。 像--single-branch
這樣的選項可以幫助避免這種情況:這有時對非常大的存儲庫很有用,或者在特定版本名稱下提交了巨大的 tarball 的存儲庫,等等。
2新創建的分支是否以及何時具有一些上游預設是可以通過--track
和--no-track
等選項配置和控制的; 這假定沒有選項的通常默認值和命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.