1

我希望能够git使用go.

我最近发现了go-git这个非常方便的包。

我也能够执行pull操作,或多或少如下:

import {
  git "gopkg.in/src-d/go-git.v4"
}

repo, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
    URL: "https://github.com/pkaramol/myrepo",
})

err := repo.Pull(&git.PullOptions{
    RemoteName: "origin"
})

我的问题是,假设我使用上述存储库的内存签出),我将如何go从存储库中读取(我的程序)文件?即假设文件

https://github.com/pkaramol/myrepo/someConfig.yaml

是否最好(如果我需要这个特定文件)只执行特定文件的 git clone (仍在内存中

4

1 回答 1

4

从文档

使用给定的选项将存储库克隆到给定的存储库和工作树文件系统中,如果工作树为 nil,则创建一个裸存储库

如果您想访问工作树,请不要传递 nil 文件系统。使用类似gopkg.in/src-d/go-billy.v4/memfs.Memory 的东西:

package main

import (
    "gopkg.in/src-d/go-git.v4"
    "gopkg.in/src-d/go-git.v4/storage/memory"
    "gopkg.in/src-d/go-billy.v4/memfs"
)

func main() {
    fs := memfs.New()

    repo, err := git.Clone(memory.NewStorage(), fs, &git.CloneOptions{
        URL: "https://github.com/pkaramol/myrepo",
    })

    file, err := fs.Open("someConfig.yaml")
}

您不能克隆单个文件(这不是 git 的工作方式),但您可以限制使用CloneOptions.Depth下载的提交数量。

于 2020-02-05T18:34:10.183 回答