我從 Gerrit 服務器中提取最后一次提交更改時遇到問題。要將更改推送到服務器,我使用 git push origin HEAD:refs/for/master。所以,我認為我可以為 pull 做類似的事情 - git pull origin HEAD:refs/for/master,但它沒有用。同時我發現,我們需要使用整個 ssh 地址,例如。git pull "ssh://the/address/to/repo",但這個解決方案也不起作用。我收到一個錯誤:找不到遠程參考 HEAD 我可以提取最新版本的唯一方法是在 Gerrit 服務器上打開最后一次提交并獲取帶有提交號的整個地址。看起來像這樣, git pull "ssh://the/repo/address/" refs/changes/34/1234/1 是否可以在不知道最后更改號的情況下拉取更改?
uj5u.com熱心網友回復:
在 Gerrit 服務器上,refs/for/是一個“神奇”的命名空間。
Gerrit 是 Git 服務器的 Java 實作,但它不是 Git。1 它是一個服務器實作,它確實在服務器“后面”有一個 Git 存盤庫。但是服務器接受git push請求并將它們傳送出去進行特殊處理,而不是像 Git 那樣將新提交放入存盤庫。為這個特殊處理接收到的提交會獲得一個分配給它們的“更改 ID”(如果它們還沒有):執行此分配會將提交更改為不同的提交。
一旦提交(或一系列提交)分配了更改 ID,Gerrit會將這些提交放入存盤庫中,使用另一個名稱:既不是您的分支名稱,也不是您的名稱,而是基于更改 ID 的名稱(加上該更改 ID 的修訂版)。refs/for/branch
要從Gerrit 服務器檢索此類提交,您需要知道分配的名稱和映射。那是你的refs/changes/34/1234/1字串。如果您不知道 Gerrit 是如何構建此字串的,也不知道更改 ID 是什么,那么您就無法預測它會是什么。
因此:
是否可以在不知道最后更改編號的情況下進行更改?
不。
1好吧,從技術上講,要說它是否是 Git,我們必須定義“Git”。出于這個特定答案的目的,我將“Git”定義為“實作 Git 協議并完全按照 Git 使用參考的方式使用參考的軟體”。Gerrit 故意違反了這個“和”的后半部分——出于充分的理由和有用的效果,但盡管如此,它違反了它,所以它不是 Git。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/497534.html
下一篇:克隆并從不同的存盤庫中提取
