我正在学习Go作为我的第一个编译语言(来自php / python)。我的第一个项目是Bitbucket的一个小的POST钩子监听器,它通过os/exec
获取然后检出Git存储库。我现在正尝试用git2go替换os/exec
来电。不过,我遇到了身份验证问题。我有以下代码:
package main
import (
git "github.com/libgit2/git2go"
"log"
)
func main() {
_, Cred := git.NewCredSshKey("git","~/.ssh/id_rsa.pub","~/.ssh/id_rsa","")
log.Println(Cred.Type())
gitH,err := git.OpenRepository(".")
if (err != nil) {
log.Fatalln(err)
}
remotes,err := gitH.ListRemotes()
if (err != nil) {
log.Fatalln(err)
}
log.Println(remotes)
origin,err := gitH.LoadRemote("origin")
if (err != nil) {
log.Fatalln(err)
}
err = origin.Fetch(nil,"")
if (err != nil) {
log.Fatalln(err)
}
}
当我运行时,我得到authentication required but no callback set
。
查看docs,看起来我需要添加对origin.SetCallbacks()
的调用,该调用需要RemoteCallbacks
结构。 RemoteCallbacks
具有函数CredentialsCallback
,它返回一个int和一个Cred
指针。由于NewCredSshKey
返回相同的值,因此我尝试添加以下内容:
var cb git.RemoteCallbacks
cb.CredentialsCallback = git.NewCredSshKey("git","~/.ssh/id_rsa.pub","~/.ssh/id_rsa","")
origin.SetCallbacks(cb)
,它给出了错误multiple-value git.NewCredSshKey() in single-value context
和
cannot use cb (type git.RemoteCallbacks) as type *git.RemoteCallbacks in function argument
。
我认为我完全误解了它是如何工作的,而且我还没有找到使用这个库的任何例子。一些例子的提示或指示将非常感激。
答案 0 :(得分:3)
一些事情:
需要将 CredentialsCallback
设置为与其签名匹配的函数,而不是此函数的输出。但是,NewCredSshKey
的签名首先是不正确的,只有它的返回值匹配。正确的签名是:
func(url string, username_from_url string, allowed_types CredType) (int, *Cred)
第二个错误cannot use cb (type git.RemoteCallbacks) as type *git.RemoteCallbacks
是因为您需要指向RemoteCallbacks
的指针。
将其声明并初始化为指针:
cb := &git.RemoteCallbacks{}
// or alternatively
// cb := new(git.RemoteCallbacks)
或者将其作为参数传递时的地址:
origin.SetCallbacks(&cb)