正在尝试从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。无法理解为什么要添加此内容。
1条答案
按热度按时间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的链接,该请求在某些情况下(但不是所有情况下)修复了问题。不过,您可能需要更新到更高版本才能利用这一点。