使用go-git的Plainclone函数,git repo url被附加上/git-upload-pack

p4rjhz4m  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(108)

正在尝试从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(“https:///git-upload-pack”)的末尾添加/git-upload-pack,因为克隆失败,状态码为400。无法理解为什么要添加此内容。

bf1o4zei

bf1o4zei1#

HTTP上的Git协议由两个步骤组成,这取决于使用的协议版本。在v0和v1中,第一个请求是/info/refs并读取正在使用的引用,然后第二个请求是/git-upload-pack(用于获取和克隆)或/git-receive-pack(用于推送)。在v2中,端点是相同的,但是第一个是能力请求,然后向第二个端点进行引用请求和数据传输。
在所有这些情况下,您提供的URL只是追加路径的基础。不同的路径使简单的Git服务器(如nginx或Apache)更容易进行访问控制,这就是为什么不仅仅是一个URL组件。
因此,生成的URL实际上是正确的。你看到400的原因是因为of an issue,其中Azure DevOps要求客户端支持multi_ack功能,而go-git不支持。虽然从技术上讲,服务器不必为任何他们不想要的客户端提供支持,但Git智能HTTP协议通常被设计为优雅地降级,因此客户端必须支持任何特定功能集的假设并不安全,Azure DevOps应该避免做出这种假设。
链接的问题有一个到pull request的链接,该请求在某些情况下(但不是所有情况下)修复了问题。不过,您可能需要更新到更高版本才能利用这一点。

相关问题