git library for Go

前端 未结 6 1921
时光说笑
时光说笑 2021-02-03 23:15

As a pet project, I want to develop a note taking app using git as storage backend. (I suspect this doesn\'t exist yet, given this guy\'s blog post: http://jarofgreen.co.uk/2012

相关标签:
6条回答
  • 2021-02-03 23:29

    What Victor proposed is indeed the "official" way to "script" Git as envisioned by its developers. Git's commands are divided in the two broad groups specifically for this purpose: the "plumbing" commands are low-level and inteneded mostly to be used by other programs; the "porcelain" command are intended to interact with the user, and call plumbing commands to do their work. Look inside the /usr/lib/git-core directory (might be different on your system) to get the idea of how many plumbing commands Git has.

    On the other hand, Go supports linking with shared libraries via its cgo facility. You hence could try wrapping libgit2 with it. AFAIK, libgit2 is not yet fully on par with the Git itself, but it is able to read/write Git repositories, do branching etc — supposedly it will be enough for your task.

    Okay, after I wrote all that, I scrolled down the "Bindings" entry on the libgit2's site and found go-git...

    0 讨论(0)
  • 2021-02-03 23:31

    I'd say git2go is the git bindings library to use in Go. It is updated regularly and maintained by the people running libgit2.

    If you are looking for a git implementation purely written in Go, go-git the most mature and active option.

    0 讨论(0)
  • 2021-02-03 23:37

    You can just shell out to git command using os/exec package from Go standard library.

    0 讨论(0)
  • 2021-02-03 23:38

    A search for "git" on GoDoc turns up some projects. There's a libgit2 wrapper, and at the bottom is an unfinished Git implementation in Go.

    0 讨论(0)
  • 2021-02-03 23:43

    use git as storage backend

    Then the Go library fluxcd/go-git-providers can come in handy.

    go-git-providers is a general-purpose Go client for interacting with Git providers' APIs (e.g. GitHub, GitLab, Bitbucket).

    Example:

    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
    }
    
    0 讨论(0)
  • 2021-02-03 23:51

    Since a few years ago, my team and I, we were coding a pure git implementation in Go, it avoids to have any c/c++ dependency and make it more flexible and easy to extend.

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

    go-git aims to reach the completeness of libgit2 or jgit, nowadays covers the majority of the plumbing read operations and some of the main write operations, but lacks the main porcelain operations such as merges.

    0 讨论(0)
提交回复
热议问题