Need help with go-git?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

2.8K Stars 323 Forks Apache License 2.0 1.8K Commits 251 Opened issues


A highly extensible Git implementation in pure Go.

Services available


Need anything else?

Contributors list

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


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

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

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.


The recommended way to install go-git is:

import "" // with go modules enabled (GO111MODULE=on or outside GOPATH)
import "" // with go modules disabled


Please note that the

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
// Clone the given repository to the given directory
Info("git clone")

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



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
// Clones the given repository in memory, creating the remote, the local
// branches and fetching the objects, exactly as:
Info("git clone")

r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{ URL: "", })


// 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 [email protected] Date: Sat Nov 12 21:18:41 2016 +0100

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

commit df707095626f384ce2dc1a83b30f9a21d69b9dfc Author: Santiago M. Mola [email protected] 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.


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


Apache License Version 2.0, see LICENSE

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.