A highly extensible Git implementation in pure Go.
Clone or download
mcuadros Merge pull request #1037 from Quasilyte/patch-1
Simplify return statement in receivePackNoCheck
Latest commit 791aea3 Dec 12, 2018
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
_examples Fix spelling and grammar in docs and example Oct 29, 2018
cli/go-git project: move imports from srcd.works to gopkg.in Mar 7, 2017
config Merge pull request #977 from filipnavara/config-test Oct 9, 2018
internal/revision all: fixes for ineffective assign Nov 26, 2017
plumbing Simplify return statement in receivePackNoCheck Dec 12, 2018
storage storage/dotgit: test setRef with a non rwfs Dec 10, 2018
utils Merge pull request #874 from smola/patchcontext Jul 10, 2018
.gitignore git: worktree, Skip special git directory. Fixes #814 Apr 18, 2018
.travis.yml travis: drop go1.9 add go1.11 Sep 10, 2018
CODE_OF_CONDUCT.md code of conduct from https://www.contributor-covenant.org/ Dec 7, 2017
COMPATIBILITY.md git: worktree, add Grep() method for git grep (#686) Dec 12, 2017
CONTRIBUTING.md add StackOverflow to support channels Oct 26, 2018
DCO added DCO Dec 21, 2017
LICENSE Update LICENSE Oct 30, 2018
MAINTAINERS MAINTAINERS: add @mcuadros, @strib and @orirawlings Dec 7, 2017
Makefile project: move imports from srcd.works to gopkg.in Mar 7, 2017
README.md Fix spelling and grammar in docs and example Oct 29, 2018
appveyor.yml *: upgrade to go-billy.v3, merge Jun 18, 2017
blame.go blame: fix edge case with missing \n in content length causing mismat… Oct 15, 2018
blame_test.go blame: fix edge case with missing \n in content length causing mismat… Oct 15, 2018
common.go submodule init and update implementation Feb 13, 2017
common_test.go Expose Storage cache. Sep 7, 2018
doc.go forcing the usage of gopkg.in/src-d/go-git.v4 Mar 13, 2017
example_test.go examples & documentation: PlainClone with Basic Authentication (Passw… Oct 25, 2018
go.mod update gcfg dependency to v1.4.0 Oct 29, 2018
go.sum update gcfg dependency to v1.4.0 Oct 29, 2018
object_walker.go git: Add Tag objects to the list of supported objects for walking Sep 7, 2018
options.go repository: improve CheckoutOption.Hash doc Oct 16, 2018
options_test.go worktree: Commit, tests improvements May 4, 2017
prune.go use time.IsZero in Prune Oct 2, 2018
prune_test.go Expose Storage cache. Sep 7, 2018
references.go references: sort: compare author timestamps when commit timestamps ar… Jan 21, 2018
references_test.go references: sort: compare author timestamps when commit timestamps ar… Oct 15, 2018
remote.go remote: use reference deltas on push when the remote server does not Oct 16, 2018
remote_test.go remote: use reference deltas on push when the remote server does not Oct 16, 2018
repository.go git: return better error message when packfile cannot be downloaded Nov 30, 2018
repository_test.go repository: fix plain clone error handling regression Nov 27, 2018
repository_unix_test.go Add sideband support for push Sep 1, 2017
repository_windows_test.go Add sideband support for push Sep 1, 2017
status.go git: Fix Status.IsClean() documentation Oct 6, 2018
submodule.go update to go-billy.v4 and go-git-fixtures.v3 Nov 23, 2017
submodule_test.go worktree: Don't allow .gitmodules to be a symlink. Fixes CVE-2018-11235 May 30, 2018
worktree.go Add Status.IsUntracked function Aug 29, 2018
worktree_bsd.go Enables building on openbsd, dragonfly bsd and solaris Oct 22, 2018
worktree_commit.go worktree: solve merge conflicts Sep 6, 2018
worktree_commit_test.go Merge branch 'master' of github.com:src-d/go-git into f-add-tagging-s… Sep 10, 2018
worktree_linux.go Added support for non-symlink checkouts on Windows when elevated righ… Mar 12, 2018
worktree_status.go Worktree: Provide ability to add excludes (#825) May 11, 2018
worktree_test.go Remove empty dirs when cleaning with Dir opt. Aug 29, 2018
worktree_unix_other.go Enables building on openbsd, dragonfly bsd and solaris Oct 22, 2018
worktree_windows.go Added support for non-symlink checkouts on Windows when elevated righ… Mar 12, 2018

README.md

go-git logo GoDoc Build Status Build status codecov.io 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 source{d} and Keybase, and by many other libraries and tools.

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:

go get -u gopkg.in/src-d/go-git.v4/...

We use gopkg.in to version the API, this means that when go get clones the package, it's the latest tag matching v4.* that is cloned and not the master branch.

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/src-d/go-git")

_, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{
    URL:      "https://github.com/src-d/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/src-d/go-siva")

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

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