Categorygithub.com/calvn/go-git
modulepackage
3.0.4+incompatible
Repository: https://github.com/calvn/go-git.git
Documentation: pkg.go.dev

# README

go-git GoDoc Build Status codecov.io codebeat badge

A low level and highly extensible git client library for reading repositories from git servers. It is written in Go from scratch, without any C dependencies.

We have been following the open/close principle in its design to facilitate extensions.

go-git does not claim to be a replacement of git2go as its approach and functionality is quite different.

ok, but why? ...

At source{d} we analyze almost all the public open source contributions made to git repositories in the world.

We want to extract detailed information from each GitHub repository, which requires downloading repository packfiles and analyzing them: extracting their code, authors, dates and the languages and ecosystems they use. We are also interested in knowing who contributes to what, so we can tell top contributors from the more casual ones.

You can obtain all this information using the standard git command running over a local clone of a repository, but this simple solution does not scale well over millions of repositories: we want to avoid having local copies of the unpacked repositories in a regular file system; go-git allows us to work with an in-memory representation of repositories instead.

I see... but this is production ready?

Yes!!!, we have been using go-git at source{d} since August 2015 to analyze all GitHub public repositories (i.e. 16M of repositories).

Coming Soon

Blame support: right now we are using a forward version of a line-tracking algorithm and we are having some problems handling merges. The plan is to get merges right and change to a backward line-tracking algorithm soon.

Installation

The recommended way to install go-git is:

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

Examples

Retrieving the commits for a given repository:

r, err := git.NewRepository("https://github.com/src-d/go-git", nil)
if err != nil {
	panic(err)
}

if err := r.PullDefault(); err != nil {
	panic(err)
}

iter := r.Commits()
defer iter.Close()

for {
	//the commits are not shorted in any special order
	commit, err := iter.Next()
	if err != nil {
		if err == io.EOF {
			break
		}

		panic(err)
	}

	fmt.Println(commit)
}

Outputs:

commit 2275fa7d0c75d20103f90b0e1616937d5a9fc5e6
Author: Máximo Cuadros <[email protected]>
Date:   2015-10-23 00:44:33 +0200 +0200

commit 35b585759cbf29f8ec428ef89da20705d59f99ec
Author: Carlos Cobo <[email protected]>
Date:   2015-05-20 15:21:37 +0200 +0200

commit 7e3259c191a9de23d88b6077dcb1cd427e925432
Author: Alberto Cortés <[email protected]>
Date:   2016-01-21 03:29:57 +0100 +0100

commit 24b8ae50db91f3909b11304014564bffc6fdee79
Author: Alberto Cortés <[email protected]>
Date:   2015-12-11 17:57:10 +0100 +0100
...

Retrieving the latest commit for a given repository:

r, err := git.NewRepository("https://github.com/src-d/go-git", nil)
if err != nil {
	panic(err)
}

if err := r.PullDefault(); err != nil {
	panic(err)
}

hash, err := r.Remotes[git.DefaultRemoteName].Head()
if err != nil {
	panic(err)
}

commit, err := r.Commit(hash)
if err != nil {
	panic(err)
}

fmt.Println(commit)

Acknowledgements

The earlier versions of the packfile reader are based on git-chain, project done by @yrashk

License

MIT, see LICENSE

# Packages

Go-git needs the packfile and the refs of the repo.
Package core implement the core interfaces and structs used by go-git.
Package diff implements line oriented diffs, similar to the ancient Unix diff command.
No description provided by the author
No description provided by the author
No description provided by the author

# Functions

NewAuthenticatedRemote returns a new Remote using the given AuthMethod, using as client http.DefaultClient.
NewCommitIter returns a CommitIter for the given repository and underlying object iterator.
No description provided by the author
NewPlainRepository creates a new repository without remotes.
NewRemote returns a new Remote, using as client http.DefaultClient.
NewRepository creates a new repository setting remote as default remote.
NewTagIter returns a TagIter for the given repository and underlying object iterator.
No description provided by the author
No description provided by the author
NewTreeWalker returns a new TreeWalker for the given repository and tree.
SortCommits sort a commit list by commit date, from older to newer.

# Constants

No description provided by the author

# Variables

New errors defined by this package.
New errors defined by this package.
No description provided by the author
No description provided by the author

# Structs

No description provided by the author
Blob is used to store file data - it is generally a file.
Commit points to a single tree, marking it as what the project looked like at a certain point in time.
CommitIter provides an iterator for a set of commits.
File represents git file objects.
No description provided by the author
No description provided by the author
No description provided by the author
Signature represents an action signed by a person.
Tag represents an annotated tag object.
TagIter provides an iterator for a set of tags.
Tree is basically like a directory - it references a bunch of other trees and/or blobs (i.e.
TreeEntry represents a file.
TreeEntryIter facilitates iterating through the TreeEntry objects in a Tree.
TreeEntryIter facilitates iterating through the descendent subtrees of a Tree.
TreeWalker provides a means of walking through all of the entries in a Tree.

# Interfaces

Object is a generic representation of any git object.

# Type aliases

No description provided by the author