首頁 >後端開發 >Golang >使用 go-git 的 Plainclone 功能時,git repo url 會附加 /git-upload-pack

使用 go-git 的 Plainclone 功能時,git repo url 會附加 /git-upload-pack

WBOY
WBOY轉載
2024-02-12 08:06:08491瀏覽

使用 go-git 的 Plainclone 功能时,git repo url 会附加 /git-upload-pack

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除