php小編百草介紹,使用go-git的Plainclone功能時,當你提供git repo url時,會自動附加/git-upload-pack。這是因為git-upload-pack是git協定用來複製和拉取遠端倉庫的指令。透過這個功能,你可以輕鬆地複製和拉取遠端倉庫,而無需手動新增/git-upload-pack。這樣一來,你可以更方便地使用go-git進行git操作,提高工作效率。
嘗試從 Azure Devops 複製儲存庫。
func (gitopt *GitOptions) clone() (*git.Repository, error) { r, err := git.PlainClone(gitopt.RepoDir, false, &git.CloneOptions{ Progress: os.Stdout, URL: "https://<path to repo>", Auth: &http.BasicAuth{ Username: "gituser", Password: gitopt.PAT, }, }) if err != nil { log.Info(err.Error()) return nil, err } return r, nil }
執行此程式碼會在 repo url 結尾加上 /git-upload-pack (「https://87673d4bab84f8a5d784bdb9c7504a91/git-upload-pack」),因此複製失敗,狀態碼為 400。 無法理解為什麼要附加此內容。
基於 HTTP 的 Git 協定由兩個步驟組成,取決於所使用的協定版本。在v0 和v1 中,第一個請求是 /info/refs
並讀取正在使用的引用,然後第二個請求是 /git-upload-pack
(用於取得和克隆)或/git-receive- pack
(用於推送)。在 v2 中,端點是相同的,但第一個是功能請求,然後向第二個端點進行 ref 請求和資料傳輸。
在所有這些情況下,您提供的 URL 只是附加路徑的基礎。不同的路徑使 nginx 或 Apache 等背後的簡單 Git 伺服器的存取控制變得更容易,這就是為什麼不只有單一 URL 元件的原因。
所以產生的 URL 實際上是正確的。您看到 400 的原因是因為有問題 Azure DevOps 要求客戶端支援 multi_ack
功能,而 go-git 不支援。雖然從技術上講,伺服器不必為任何他們不想提供的客戶端提供支持,但 Git 智慧 HTTP 協定通常設計為優雅地降級,因此客戶端必然支持任何特定的一組並不是一個安全的假設。功能,而 Azure DevOps 應避免做出這種假設。
連結的問題有一個指向拉取請求的鏈接,該請求修復了某些(但不是全部)情況下的問題。不過,您可能需要更新到更高版本才能利用這一點。
以上是使用 go-git 的 Plainclone 功能時,git repo url 會附加 /git-upload-pack的詳細內容。更多資訊請關注PHP中文網其他相關文章!