dongxi2163 2014-08-01 17:15
浏览 116
已采纳

git2go中的SSH身份验证

I'm working on learning Go as my first compiled language (coming from php/python). My first project was a small POST hook listener for Bitbucket, which fetches and then checks out a Git repository via os/exec. I'm now trying to replace the os/exec calls with git2go. I'm running into a snag with the authentication, though. I have the following code:

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)
    }
}

When I run this I get authentication required but no callback set.

Looking at the docs, it looks like I need to add a call to origin.SetCallbacks() which expects a RemoteCallbacks struct. RemoteCallbacks has the function CredentialsCallback which returns an int and a Cred pointer. Since NewCredSshKey returns the same values, I tried adding the following:

var cb git.RemoteCallbacks
cb.CredentialsCallback = git.NewCredSshKey("git","~/.ssh/id_rsa.pub","~/.ssh/id_rsa","")
origin.SetCallbacks(cb)

which gives the errors multiple-value git.NewCredSshKey() in single-value context and cannot use cb (type git.RemoteCallbacks) as type *git.RemoteCallbacks in function argument.

I think I'm completely misunderstanding how this works, and I haven't been able to find any examples using this library. Tips or pointers to some examples would be much appreciated.

  • 写回答

1条回答 默认 最新

  • duancai7568 2014-08-01 17:51
    关注

    A Couple of things:

    CredentialsCallback needs to be set to a function that matches it's signature, not the output of such a function. However, the signature for NewCredSshKey isn't correct in the first place, only its return values match. The correct signature is:

    func(url string, username_from_url string, allowed_types CredType) (int, *Cred)
    

    The second error cannot use cb (type git.RemoteCallbacks) as type *git.RemoteCallbacks is because you need a pointer to a RemoteCallbacks.

    Either declare and initialize it as a pointer:

    cb := &git.RemoteCallbacks{}
    // or alternatively 
    // cb := new(git.RemoteCallbacks)
    

    or take the address of when passing it as an argument:

    origin.SetCallbacks(&cb)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料