MCPcopy
hub / github.com/go-git/go-git

github.com/go-git/go-git @v5.19.1 sqlite

repository ↗ · DeepWiki ↗ · release v5.19.1 ↗
5,224 symbols 25,266 edges 474 files 1,581 documented · 30%
README

go-git logo GoDoc Build Status Go Report Card

go-git is a highly extensible git implementation library written in pure Go.

It can be used to manipulate git repositories at low level (plumbing) or high level (porcelain), through an idiomatic Go API. It also supports several types of storage, such as in-memory filesystems, or custom implementations, thanks to the Storer interface.

It's being actively developed since 2015 and is being used extensively by Keybase, Gitea or Pulumi, and by many other libraries and tools.

Project Status

After the legal issues with the src-d organization, the lack of update for four months and the requirement to make a hard fork, the project is now back to normality.

The project is currently actively maintained by individual contributors, including several of the original authors, but also backed by a new company, gitsight, where go-git is a critical component used at scale.

Comparison with git

go-git aims to be fully compatible with git, all the porcelain operations are implemented to work exactly as git does.

git is a humongous project with years of development by thousands of contributors, making it challenging for go-git to implement all the features. You can find a comparison of go-git vs git in the compatibility documentation.

Installation

The recommended way to install go-git is:

import "github.com/go-git/go-git/v5" // with go modules enabled (GO111MODULE=on or outside GOPATH)
import "github.com/go-git/go-git" // with go modules disabled

Examples

Please note that the CheckIfError and Info functions used in the examples are from the examples package just to be used in the examples.

Basic example

A basic example that mimics the standard git clone command

// Clone the given repository to the given directory
Info("git clone https://github.com/go-git/go-git")

_, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{
    URL:      "https://github.com/go-git/go-git",
    Progress: os.Stdout,
})

CheckIfError(err)

Outputs:

Counting objects: 4924, done.
Compressing objects: 100% (1333/1333), done.
Total 4924 (delta 530), reused 6 (delta 6), pack-reused 3533

In-memory example

Cloning a repository into memory and printing the history of HEAD, just like git log does

// Clones the given repository in memory, creating the remote, the local
// branches and fetching the objects, exactly as:
Info("git clone https://github.com/go-git/go-billy")

r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
    URL: "https://github.com/go-git/go-billy",
})

CheckIfError(err)

// Gets the HEAD history from HEAD, just like this command:
Info("git log")

// ... retrieves the branch pointed by HEAD
ref, err := r.Head()
CheckIfError(err)


// ... retrieves the commit history
cIter, err := r.Log(&git.LogOptions{From: ref.Hash()})
CheckIfError(err)

// ... just iterates over the commits, printing it
err = cIter.ForEach(func(c *object.Commit) error {
    fmt.Println(c)
    return nil
})
CheckIfError(err)

Outputs:

commit ded8054fd0c3994453e9c8aacaf48d118d42991e
Author: Santiago M. Mola <santi@mola.io>
Date:   Sat Nov 12 21:18:41 2016 +0100

    index: ReadFrom/WriteTo returns IndexReadError/IndexWriteError. (#9)

commit df707095626f384ce2dc1a83b30f9a21d69b9dfc
Author: Santiago M. Mola <santi@mola.io>
Date:   Fri Nov 11 13:23:22 2016 +0100

    readwriter: fix bug when writing index. (#10)

    When using ReadWriter on an existing siva file, absolute offset for
    index entries was not being calculated correctly.
...

You can find this example and many others in the examples folder.

Contribute

Contributions are more than welcome, if you are interested please take a look to our Contributing Guidelines.

License

Apache License Version 2.0, see LICENSE

Extension points exported contracts — how you extend this code

Hasher (Interface)
Hasher interface is implemented by types that can tell you their hash. [18 implementers]
utils/merkletrie/noder/noder.go
Storage (Interface)
Storage is a transactional implementation of git.Storer, it demux the write and read operation of two separate storers, [11 …
storage/transactional/storage.go
EncodedObject (Interface)
Object is a generic representation of any git object [6 implementers]
plumbing/object.go
ReferenceIter (Interface)
ReferenceIter is a generic closable interface for iterating over references. [24 implementers]
plumbing/storer/reference.go
CommitIter (Interface)
CommitIter is a generic closable interface for iterating over commits. [24 implementers]
plumbing/object/commit.go
EntryIter (Interface)
EntryIter is an iterator that will return the entries in a packfile index. [27 implementers]
plumbing/format/idxfile/idxfile.go
Transport (Interface)
Transport can initiate git-upload-pack and git-receive-pack processes. It is implemented both by the client and the serv [5 …
plumbing/transport/common.go
ConfigStorer (Interface)
ConfigStorer generic storage of Config object [4 implementers]
config/config.go

Core symbols most depended-on inside this repo

NewHash
called by 752
plumbing/hash.go
String
called by 549
plumbing/format/gitattributes/attributes.go
Join
called by 265
storage/filesystem/dotgit/repository_filesystem.go
Hash
called by 227
plumbing/object.go
NewStorage
called by 222
storage/memory/storage.go
Name
called by 169
utils/merkletrie/noder/noder.go
Close
called by 160
plumbing/object/commit.go
CheckIfError
called by 138
_examples/common.go

Shape

Method 3,472
Function 1,065
Struct 521
TypeAlias 81
Interface 72
FuncType 13

Languages

Go100%

Modules by API surface

repository_test.go163 symbols
worktree_test.go109 symbols
repository.go89 symbols
remote_test.go72 symbols
storage/filesystem/dotgit/dotgit.go67 symbols
storage/filesystem/dotgit/dotgit_test.go62 symbols
plumbing/object/tree_test.go59 symbols
remote.go51 symbols
plumbing/storer/object.go49 symbols
storage/filesystem/object.go48 symbols
plumbing/format/gitignore/pattern_test.go48 symbols
worktree.go46 symbols

Dependencies from manifests, versioned

dario.cat/mergov1.0.0 · 1×
github.com/Microsoft/go-winiov0.6.2 · 1×
github.com/ProtonMail/go-cryptov1.1.6 · 1×
github.com/anmitsu/go-shlexv0.0.0-2020051411343 · 1×
github.com/armon/go-socks5v0.0.0-2016090218423 · 1×
github.com/cloudflare/circlv1.6.3 · 1×
github.com/cyphar/filepath-securejoinv0.6.1 · 1×
github.com/davecgh/go-spewv1.1.1 · 1×
github.com/elazarl/goproxyv1.7.2 · 1×
github.com/go-git/gcfgv1.5.1-0.20230307220 · 1×

For agents

$ claude mcp add go-git \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact