Article
gogit — read Git repositories from Go
If you need to read Git repositories from Go, instead of calling
git
command-line tool, consider using gogit.
Gogit is Git repository reader written in pure Go. You can access any object stored in git object store: blobs, commits, trees, tags.
How to use gogit
First you need to open a repository by callingOpenRepository
function with a path to the repo. Then you can use Lookup...
methods to find objects:
LookupBlob
— finds the blob by its SHA1,LookupCommit
— finds a commit by its SHA1,LookupReference
— finds a reference, such as HEAD, a branch, a tag, by its name,LookupTag
— finds a tag object by its SHA1,LookupTree
— finds a tree object by its SHA1.
ObjectSize
method, and its type by calling Type
and passing them an object hash.
SHA1 hashes for those functions are represented with pointers to struct of Oid
type:
type Oid struct {
Bytes SHA1
}
which you can create from bytes or hex string.
Here's an example from README of how to open repository, find its HEAD, get the tree for the latest commit, and walk it, printing file names:
package main
import (
"github.com/speedata/gogit"
"log"
"os"
"path"
"path/filepath"
)
func walk(dirname string, te *gogit.TreeEntry) int {
log.Println(path.Join(dirname, te.Name))
return 0
}
func main() {
wd, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
repository, err := gogit.OpenRepository(filepath.Join(wd, "src/github.com/speedata/gogit/_testdata/testrepo.git"))
if err != nil {
log.Fatal(err)
}
ref, err := repository.LookupReference("HEAD")
if err != nil {
log.Fatal(err)
}
ci, err := repository.LookupCommit(ref.Oid)
if err != nil {
log.Fatal(err)
}
ci.tree.Walk(walk)
}
Looks pretty easy!
How to get gogit
You can install gogit withgo get
:
go get github.com/speedata/gogit