A highly extensible Git implementation in pure Go.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Máximo Cuadros 1a7db85bca
Merge pull request #1231 from alexandear/fix-typos
1 month ago
_examples Fix typos in comments, variables and function names 1 month ago
cli/go-git project: move imports from srcd.works to gopkg.in 2 years ago
config Merge pull request #1231 from alexandear/fix-typos 1 month ago
internal Fix typos in comments, variables and function names 1 month ago
plumbing Fix typos in comments, variables and function names 1 month ago
storage Fix typos in comments, variables and function names 1 month ago
utils Fix typos in comments, variables and function names 1 month ago
.gitignore git: worktree, Skip special git directory. Fixes #814 1 year ago
.travis.yml travis: drop go1.10 add go1.12 8 months ago
CODE_OF_CONDUCT.md code of conduct from https://www.contributor-covenant.org/ 2 years ago
COMPATIBILITY.md typo 1 month ago
CONTRIBUTING.md add StackOverflow to support channels 1 year ago
DCO added DCO 1 year ago
LICENSE Update LICENSE 1 year ago
MAINTAINERS MAINTAINERS: add @mcuadros, @strib and @orirawlings 2 years ago
Makefile Add -coverpkg to fix test coverage 4 months ago
README.md Fix spelling and grammar in docs and example 1 year ago
appveyor.yml *: upgrade to go-billy.v3, merge 2 years ago
blame.go *: avoid unnecessary conversions 4 months ago
blame_test.go blame: fix edge case with missing \n in content length causing mismatched length error 1 year ago
common.go submodule init and update implementation 2 years ago
common_test.go Expose Storage cache. 1 year ago
doc.go forcing the usage of gopkg.in/src-d/go-git.v4 2 years ago
example_test.go examples & documentation: PlainClone with Basic Authentication (Password & Access Token) (#990) 1 year ago
go.mod *: go module update 4 months ago
go.sum *: go module update 4 months ago
object_walker.go Fix typos in comments, variables and function names 1 month ago
options.go Add limiting options to git log 4 months ago
options_test.go worktree: Commit, tests improvements 2 years ago
prune.go use time.IsZero in Prune 1 year ago
prune_test.go *: added missing error checks in tests 4 months ago
references.go references: sort: compare author timestamps when commit timestamps are equal. Fixes #725 1 year ago
references_test.go references: sort: compare author timestamps when commit timestamps are equal, test 1 year ago
remote.go *: fixed tautological error conditionsautological error conditions 4 months ago
remote_test.go Merge pull request #1165 from seletskiy/push-prune 4 months ago
repository.go Add limiting options to git log 4 months ago
repository_test.go Add limiting options to git log 4 months ago
repository_unix_test.go Add sideband support for push 2 years ago
repository_windows_test.go Add sideband support for push 2 years ago
status.go git: Fix Status.IsClean() documentation 1 year ago
submodule.go update to go-billy.v4 and go-git-fixtures.v3 2 years ago
submodule_test.go worktree: Don't allow .gitmodules to be a symlink. Fixes CVE-2018-11235 1 year ago
worktree.go Worktree: improve build index performance. (#1179) 4 months ago
worktree_bsd.go Enables building on openbsd, dragonfly bsd and solaris 1 year ago
worktree_commit.go worktree: solve merge conflicts 1 year ago
worktree_commit_test.go *: added missing error checks in tests 4 months ago
worktree_linux.go worktree: force convert to int64 to support 32bit os. Fix #1202 4 months ago
worktree_status.go worktree: enable manual ignore patterns when no .gitignore is available 9 months ago
worktree_test.go *: avoid unnecessary conversions 4 months ago
worktree_unix_other.go Enables building on openbsd, dragonfly bsd and solaris 1 year ago
worktree_windows.go Added support for non-symlink checkouts on Windows when elevated rights are missing 1 year ago

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