git2go中的SSH身份验证

时间:2014-08-01 17:15:59

标签: go libgit2

我正在学习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 contextcannot use cb (type git.RemoteCallbacks) as type *git.RemoteCallbacks in function argument

我认为我完全误解了它是如何工作的,而且我还没有找到使用这个库的任何例子。一些例子的提示或指示将非常感激。

1 个答案:

答案 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)