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)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图