27

作为一个宠物项目,我想开发一个使用 git 作为存储后端的笔记应用程序。(我怀疑这还不存在,鉴于此人的博客文章:http: //jarofgreen.co.uk/2012/08/how-about-a-mobile-note-app-backed-by-git/

现在,我想借此机会玩一下围棋。但是,我似乎找不到任何适用于 Go 的 git 库(甚至是最小的方法)。真的有吗?

显然我对 Go 的了解是不存在的,所以为 libgit 编写绑定似乎不是一个有趣的开始方式......(我可能会求助于 ruby​​,我也不知道)

4

7 回答 7

44

我想说git2go是在 Go 中使用的 git 绑定库。它会定期更新并由运行 libgit2 的人员维护。

如果你正在寻找一个纯粹用 Go 编写的 git 实现,那么go-git是最成熟和最活跃的选择。

于 2013-07-02T15:21:34.000 回答
13

您可以使用Go 标准库中的os/execgit包来执行命令。

于 2012-11-23T16:15:16.513 回答
13

几年前,我和我的团队在 Go 中编写了一个纯 git 实现,它避免了任何 c/c++ 依赖并使其更加灵活和易于扩展。

https://github.com/go-git/go-git

go-git 旨在达到 libgit2 或 jgit 的完整性,现在涵盖了大部分管道读取操作和一些主要的写入操作,但缺少合并等主要瓷器操作。

于 2017-01-21T04:20:44.663 回答
7

Victor 提出的确实是其开发人员所设想的“脚本”Git 的“官方”方式。Git 的命令专门为此目的分为两大类:“管道”命令是低级的,主要用于其他程序;“瓷器”命令旨在与用户交互,并调用管道命令来完成他们的工作。查看/usr/lib/git-core目录内部(可能在您的系统上有所不同)以了解 Git 有多少管道命令。

另一方面,Go 支持通过其cgo工具与共享库链接。因此,您可以尝试libgit2使用它进行包装。AFAIK,libgit2还没有完全与 Git 本身相提并论,但它能够读/写 Git 存储库、进行分支等——据说它足以完成你的任务。

好的,在我写完所有内容之后,我向下滚动了libgit2网站上的“Bindings”条目,发现go-git......

于 2012-11-23T16:38:20.603 回答
3

GoDoc 上搜索“git”会出现一些项目。有一个 libgit2 包装器,底部是Go 中未完成的 Git 实现

于 2012-11-23T16:42:13.747 回答
2

golang -gitoperations模块为命令行工具提供了一个基于 os/exec 的接口。

于 2021-02-11T02:59:42.733 回答
0

使用 git 作为存储后端

那么 Go 库fluxcd/go-git-providers就可以派上用场了。

go-git-providers是一个通用的 Go 客户端,用于与 Git 提供者的 API(例如 GitHub、GitLab、Bitbucket)进行交互。

例子:

package github_test

import (
    "context"
    "fmt"

    "github.com/fluxcd/go-git-providers/github"
    "github.com/fluxcd/go-git-providers/gitprovider"
    gogithub "github.com/google/go-github/v32/github"
)

func ExampleOrgRepositoriesClient_Get() {
    // Create a new client
    ctx := context.Background()
    c, err := github.NewClient()
    checkErr(err)

    // Parse the URL into an OrgRepositoryRef
    ref, err := gitprovider.ParseOrgRepositoryURL("https://github.com/fluxcd/flux")
    checkErr(err)

    // Get public information about the flux repository.
    repo, err := c.OrgRepositories().Get(ctx, *ref)
    checkErr(err)

    // Use .Get() to aquire a high-level gitprovider.OrganizationInfo struct
    repoInfo := repo.Get()
    // Cast the internal object to a *gogithub.Repository to access custom data
    internalRepo := repo.APIObject().(*gogithub.Repository)

    fmt.Printf("Description: %s. Homepage: %s", *repoInfo.Description, internalRepo.GetHomepage())
    // Output: Description: The GitOps Kubernetes operator. Homepage: https://docs.fluxcd.io
}
于 2020-08-19T16:05:20.740 回答