在典型的“常規” git clone 中,最終結果.git/config如下:
[remote "origin"]
url = [email protected]:orgname/reponame.git
fetch = refs/heads/*:refs/remotes/origin/*
然后git show origin/HEAD作業正常。
但是,我不希望獲取所有分支,只獲取prod前綴為 的分支jakub/,所以我.git/config的如下:
[remote "origin"]
url = [email protected]:orgname/reponame.git
fetch = refs/heads/prod:refs/remotes/origin/prod
fetch = refs/heads/jakub/*:refs/remotes/origin/jakub/*
(我沒有做 a git clone,但在上面創建了一個.git/config類似的,然后做了git fetch)。
但是,使用該設定,git show origin/HEAD不再起作用:
fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.
我嘗試添加以下內容,.git/config但它不起作用:
fetch = refs/heads/HEAD:refs/remotes/origin/HEAD
$ git fetch
fatal: couldn't find remote ref refs/heads/HEAD
origin/HEAD使用部分提取進行作業的正確方法是什么?
uj5u.com熱心網友回復:
如果遠程存盤庫的 HEAD 分支是您的 fetch refspecs 中配置的分支之一,那么這應該有效:
git remote set-head origin -a
這將查詢遠程的 HEAD 并設定origin/HEAD為指向存盤庫中相應的遠程跟蹤分支。
如果遠程 HEAD 指向您的 fetch refspec 未涵蓋的分支,那么您必須為該分支添加一個 fetch refspec,獲取它,然后運行上述命令。
uj5u.com熱心網友回復:
這個名字origin/HEAD是一個象征性的參考。除了最初git clone的 ,使用它的面向用戶的命令是git remote set-head.
要使符號參考起作用,該符號參考的目標必須存在。->目標顯示在ingit branch -r或類似輸出的右側:
origin/HEAD -> origin/master
在這里,目標origin/HEAD是origin/master。origin/master如果我在我自己的克隆中沒有名稱,origin/HEAD將無法正常作業。
所以:你需要的是獲取和創建,存盤庫中“默認分支”的名稱在哪里。自從:origin/thingthingorigin
fetch = refs/heads/*:refs/remotes/origin/*
為該存盤庫中的每個分支名稱創建和更新遠程跟蹤名稱,無論哪個分支名稱是默認分支1將2存在于此處,并且它都按照您想要的方式作業。origin/thing
但是,當您進行單分支克隆3時,您會指示 Git 僅獲取一個特定的分支名稱。添加更多分支(帶有git remote set-branches)可讓您添加到集合中。
為了讓 Git 首先創建 origin/HEAD,Git 要求目標確實存在。所以之后,例如:
git clone --single-branch -b next https://github.com/git/git
我得到了一個新的 Git 存盤庫克隆,其中只存在兩個名稱:
$ git branch -a
* next
remotes/origin/next
請注意缺少origin/HEAD. 但現在是猜謎游戲:我應該添加哪個遠程跟蹤名稱? 有幾種方法可以找到,包括使用git ls-remote --symref或git remote set-head:
$ git ls-remote --symref origin HEAD
ref: refs/heads/master HEAD
c03801e19cb8ab36e9c0d17ff3d5e0c3b0f24193 HEAD
$ git remote set-head origin --auto
error: Not a valid ref: refs/remotes/origin/master
origin/HEAD set to master
最后輸出行是一個謊言:因為我沒有,origin/master沒有origin/HEAD 設定為master. 但是這里的輸出顯示了我需要哪個分支來“git remote set-branches --add”:
$ git remote set-branches --add origin master
$ git fetch origin
From github.com:git/git
* [new branch] master -> origin/master
$ git branch -r
origin/master
origin/next
$ git remote set-head origin --auto
origin/HEAD set to master
$ git branch -r
origin/HEAD -> origin/master
origin/master
origin/next
現在它完成了。
1 Git 使用術語默認分支HEAD來表示“存盤在您克隆的存盤庫中的任何分支名稱”。特別是 GitHub 允許您通過在其 Web 界面中導航到存盤庫并使用各種單擊按鈕等來選擇任何分支名稱來更改此設定。這當然假設您有權設定它們。
2從技術上講,意志力太強了:默認的分支設定HEAD取決于服務器主機系統,而谷歌代碼,出于某種原因,只有谷歌代碼的人知道,沒有提供設定的方法——設定被卡住了對于許多只有“主”的存盤庫,在“主”上。在這種情況下,origin/HEAD指向一個不存在的名稱。
3請注意,雖然git clone --single-branch這樣做是顯而易見的方法,但git clone --depth打開單分支。還要注意,這個術語是單分支克隆,即使它是兩個或三個分支克隆;部分克隆是指逐漸出現在 Git 中的一項新功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/526364.html
標籤:混帐获取
