commit | 52c1f982ea0004de419d1a7f69d7eaf8b8d6b659 | [log] [tgz] |
---|---|---|
author | Jeremy Stribling <strib@alum.mit.edu> | Sun Sep 10 20:59:31 2017 -0700 |
committer | Jeremy Stribling <strib@alum.mit.edu> | Mon Sep 11 08:56:54 2017 -0700 |
tree | 582a03b677b2a4c34c46c83f6511ad141c7b3ccb | |
parent | bb3217ce5d5ed682a5c830c40ea031d3c92a8a7e [diff] |
config: support a configurable, and turn-off-able, pack.window One use of go-git is to transfer git data from a non-standard git repo (not stored in a file system, for example) to a "remote" backed by a standard, local .git repo. In this scenario, delta compression is not needed to reduce transfer time over the "network", because there is no network. The underlying storage layer has already taken care of the data tranfer, and sending the objects to local .git storage doesn't require compression. So this PR gives the user the option to turn off compression when it isn't needed. Of course, this results in a larger, uncompressed local .git repo, but the user can then run git gc or git repack on that repo if they care about the storage costs. Turning the pack window to 0 on reduces total push time of a 36K repo by 50 seconds (out of a pre-PR total of 3m26s).
A highly extensible git implementation in pure Go.
go-git aims to reach the completeness of libgit2 or jgit, nowadays covers the majority of the plumbing read operations and some of the main write operations, but lacks the main porcelain operations such as merges.
It is highly extensible, we have been following the open/close principle in its design to facilitate extensions, mainly focusing the efforts on the persistence of the objects.
The master branch represents the v4
of the library, it is currently under active development and is planned to be released in early 2017.
If you are looking for a production ready version, please take a look to the v3
which is being used in production at source{d} since August 2015 to analyze all GitHub public repositories (i.e. 16M repositories).
We recommend the use of v4
to develop new projects since it includes much new functionality and provides a more idiomatic git API
The recommended way to install go-git is:
go get -u gopkg.in/src-d/go-git.v4/...
Please note that the functions
CheckIfError
andInfo
used in the examples are from the examples package just to be used in the examples.
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
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 does: Info("git log") // ... retrieves the branch pointed by HEAD ref, err := r.Head() CheckIfError(err) // ... retrieves the commit object commit, err := r.CommitObject(ref.Hash()) CheckIfError(err) // ... retrieves the commit history history, err := commit.History() CheckIfError(err) // ... just iterates over the commits, printing it for _, c := range history { fmt.Println(c) }
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 other at the examples folder
In the compatibility documentation you can find a comparison table of git with go-git.
If you are interested on contributing to go-git, open an issue explaining which missing functionality you want to work in, and we will guide you through the implementation.
MIT, see LICENSE