- Notifications
You must be signed in to change notification settings - Fork0
A highly extensible Git implementation in pure Go.
License
OmaRowe/go-git
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
go-git is a highly extensible git implementation library written inpure 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 theStorer
interface.
It's being actively developed since 2015 and is being used extensively byKeybase,Gitea orPulumi, and by many other libraries and tools.
After the legal issues with thesrc-d
organization, the lack of update for four months and the requirement to make a hard fork, the project isnow 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, wherego-git
is a critical component used at scale.
go-git aims to be fully compatible withgit, all theporcelain operations are implemented to work exactly asgit does.
git is a humongous project with years of development by thousands of contributors, making it challenging forgo-git to implement all the features. You can find a comparison ofgo-git vsgit in thecompatibility documentation.
The recommended way to installgo-git is:
import"github.com/go-git/go-git/v5"// with go modules enabled (GO111MODULE=on or outside GOPATH)import"github.com/go-git/go-git"// with go modules disabled
Please note that the
CheckIfError
andInfo
functions used in the examples are from theexamples package just to be used in the examples.
A basic example that mimics the standardgit clone
command
// Clone the given repository to the given directoryInfo("git clone https://github.com/go-git/go-git")_,err:=git.PlainClone("/tmp/foo",false,&git.CloneOptions{URL:"https://github.com/go-git/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 likegit 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/go-git/go-billy")r,err:=git.Clone(memory.NewStorage(),nil,&git.CloneOptions{URL:"https://github.com/go-git/go-billy",})CheckIfError(err)// Gets the HEAD history from HEAD, just like this command:Info("git log")// ... retrieves the branch pointed by HEADref,err:=r.Head()CheckIfError(err)// ... retrieves the commit historycIter,err:=r.Log(&git.LogOptions{From:ref.Hash()})CheckIfError(err)// ... just iterates over the commits, printing iterr=cIter.ForEach(func(c*object.Commit)error {fmt.Println(c)returnnil})CheckIfError(err)
Outputs:
commit ded8054fd0c3994453e9c8aacaf48d118d42991eAuthor: Santiago M. Mola <santi@mola.io>Date: Sat Nov 12 21:18:41 2016 +0100 index: ReadFrom/WriteTo returns IndexReadError/IndexWriteError. (#9)commit df707095626f384ce2dc1a83b30f9a21d69b9dfcAuthor: 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 thisexample and many others in theexamples folder.
Contributions are more than welcome, if you are interested please take a look toourContributing Guidelines.
Apache License Version 2.0, seeLICENSE
About
A highly extensible Git implementation in pure Go.
Resources
License
Code of conduct
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Languages
- Go99.7%
- Other0.3%