如何使用git2go/libgit2从blob获取实际文件?

如何使用git2go/libgit2从blob获取实际文件?,go,libgit2,Go,Libgit2,这可能是因为我不知道git在幕后做什么,但我正在尝试使用git2go克隆一个repo,就像您在bash中运行git clone一样。我可以克隆repo以获得repo通常的.git/文件夹的内容。然后我试图从那里得到实际的项目文件。为此,我获取从克隆返回的repo的索引,然后用该索引编写一个树。然后我迷路了,但我现在做的是: type Project struct { conf config.Project State string ABSPath s

这可能是因为我不知道git在幕后做什么,但我正在尝试使用git2go克隆一个repo,就像您在bash中运行
git clone
一样。我可以克隆repo以获得repo通常的.git/文件夹的内容。然后我试图从那里得到实际的项目文件。为此,我获取从克隆返回的repo的索引,然后用该索引编写一个树。然后我迷路了,但我现在做的是:

type Project struct {
    conf      config.Project
    State     string
    ABSPath   string
    Services  map[string]*Service
    creds     *credentials.RawCredentials
    gitCreds  *git.Cred
    clonePath string
    CloneOpts *git.CloneOptions
}

func (p *Project) Unpack(repo *git.Repository) error {
    index, indexErr := repo.Index()
    if indexErr != nil {
        return indexErr
    }
    log.Println(*index)
    oid, writeErr := index.WriteTree()
    if writeErr != nil {
        return writeErr
    }
    blob, blobErr := repo.LookupBlob(oid)
    if blobErr != nil {
        return blobErr
    }
    content := blob.Contents()
    log.Println((string)(content))
    return nil
}

目前,内容为空。我在这里的目标是解开整个回购协议。我相信我需要穿过工作树才能做到这一点。我的方向正确吗?

当你调用
git.Clone()
时,如果你没有包含
&CloneOptions{Bare:true}
,那么你的工作目录应该被填充。

你是说
git.Clone()
没有将文件写入workdir吗?克隆过程的一部分是初始签出,如果没有发生,那就是一个bug。当调用
git.clone()
时,如果没有包含
&CloneOptions{Bare:true}
,则应该填充工作目录。比如说“卡洛斯,如果不是,那就是个虫子”。@matt.s是的,你是对的,介意回答一下吗?