Documentation ¶
Overview ¶
Package git is 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.
Small example extracting the commits from a repository:
func ExampleBasic_printCommits() { r, err := git.NewRepository("https://github.com/src-d/go-git", nil) if err != nil { panic(err) } if err := r.Pull("origin", "refs/heads/master"); err != nil { panic(err) } iter := r.Commits() defer iter.Close() for { commit, err := iter.Next() if err != nil { if err == io.EOF { break } panic(err) } fmt.Println(commit) } }
Index ¶
- Constants
- Variables
- func SortCommits(l []*Commit)
- type Blame
- type Blob
- type Commit
- func (c *Commit) Blame(path string) (*Blame, error)
- func (c *Commit) Decode(o core.Object) error
- func (c *Commit) File(path string) (file *File, err error)
- func (c *Commit) NumParents() int
- func (c *Commit) Parents() *CommitIter
- func (c *Commit) References(path string) ([]*Commit, error)
- func (c *Commit) String() string
- func (c *Commit) Tree() *Tree
- type CommitIter
- type File
- type FileIter
- type Hash
- type Remote
- func (r *Remote) Capabilities() *common.Capabilities
- func (r *Remote) Connect() error
- func (r *Remote) DefaultBranch() string
- func (r *Remote) Fetch(req *common.GitUploadPackRequest) (io.ReadCloser, error)
- func (r *Remote) FetchDefaultBranch() (io.ReadCloser, error)
- func (r *Remote) Info() *common.GitUploadPackInfo
- func (r *Remote) Ref(refName string) (core.Hash, error)
- func (r *Remote) Refs() map[string]core.Hash
- type Repository
- func (r *Repository) Blob(h core.Hash) (*Blob, error)
- func (r *Repository) Commit(h core.Hash) (*Commit, error)
- func (r *Repository) Commits() *CommitIter
- func (r *Repository) Pull(remoteName, branch string) (err error)
- func (r *Repository) Tag(h core.Hash) (*Tag, error)
- func (r *Repository) Tags() *TagIter
- func (r *Repository) Tree(h core.Hash) (*Tree, error)
- type Signature
- type Tag
- type TagIter
- type Tree
- type TreeEntry
- type TreeEntryIter
- type TreeIter
- type TreeWalker
Constants ¶
const (
DefaultRemoteName = "origin"
)
Variables ¶
var ( ErrMaxTreeDepth = errors.New("maximum tree depth exceeded") ErrFileNotFound = errors.New("file not found") )
New errors defined by this package.
var ErrUnsupportedObject = errors.New("unsupported object type")
var (
ObjectNotFoundErr = errors.New("object not found")
)
Functions ¶
func SortCommits ¶
func SortCommits(l []*Commit)
SortCommits sort a commit list by commit date, from older to newer.
Types ¶
type Blob ¶
Blob is used to store file data - it is generally a file.
type Commit ¶
type Commit struct { Hash core.Hash Author Signature Committer Signature Message string // contains filtered or unexported fields }
Commit points to a single tree, marking it as what the project looked like at a certain point in time. It contains meta-information about that point in time, such as a timestamp, the author of the changes since the last commit, a pointer to the previous commit(s), etc. http://schacon.github.io/gitbook/1_the_git_object_model.html
func (*Commit) Blame ¶
Blame returns the last commit that modified each line of a file in a repository.
The file to blame is identified by the input arguments: repo, commit and path. The output is a slice of commits, one for each line in the file.
Blaming a file is a two step process:
1. Create a linear history of the commits affecting a file. We use revlist.New for that.
2. Then build a graph with a node for every line in every file in the history of the file.
Each node (line) holds the commit where it was introduced or last modified. To achieve that we use the FORWARD algorithm described in Zimmermann, et al. "Mining Version Archives for Co-changed Lines", in proceedings of the Mining Software Repositories workshop, Shanghai, May 22-23, 2006.
Each node is asigned a commit: Start by the nodes in the first commit. Assign that commit as the creator of all its lines.
Then jump to the nodes in the next commit, and calculate the diff between the two files. Newly created lines get assigned the new commit as its origin. Modified lines also get this new commit. Untouched lines retain the old commit.
All this work is done in the assignOrigin function which holds all the internal relevant data in a "blame" struct, that is not exported.
TODO: ways to improve the efficiency of this function:
1. Improve revlist
2. Improve how to traverse the history (example a backward traversal will be much more efficient)
TODO: ways to improve the function in general:
1. Add memoization between revlist and assign.
2. It is using much more memory than needed, see the TODOs below.
func (*Commit) File ¶
File returns the file with the specified "path" in the commit and a nil error if the file exists. If the file does not exists, it returns a nil file and the ErrFileNotFound error.
func (*Commit) NumParents ¶
NumParents returns the number of parents in a commit.
func (*Commit) Parents ¶
func (c *Commit) Parents() *CommitIter
func (*Commit) References ¶
References returns a References for the file at "path", the commits are sorted in commit order. It stops searching a branch for a file upon reaching the commit were the file was created.
Caveats:
- Moves and copies are not currently supported.
- Cherry-picks are not detected unless there are no commits between them and therefore can appear repeated in the list. (see git path-id for hints on how to fix this).
type CommitIter ¶
type CommitIter struct { core.ObjectIter // contains filtered or unexported fields }
func NewCommitIter ¶
func NewCommitIter(r *Repository, iter core.ObjectIter) *CommitIter
func (*CommitIter) Next ¶
func (iter *CommitIter) Next() (*Commit, error)
type File ¶
File represents git file objects.
type FileIter ¶
type FileIter struct {
// contains filtered or unexported fields
}
func NewFileIter ¶
func NewFileIter(r *Repository, t *Tree) *FileIter
type Remote ¶
type Remote struct { Endpoint common.Endpoint Auth common.AuthMethod // contains filtered or unexported fields }
func NewAuthenticatedRemote ¶
func NewAuthenticatedRemote(url string, auth common.AuthMethod) (*Remote, error)
NewAuthenticatedRemote returns a new Remote using the given AuthMethod, using as client http.DefaultClient
func (*Remote) Capabilities ¶
func (r *Remote) Capabilities() *common.Capabilities
Capabilities returns the remote capabilities
func (*Remote) DefaultBranch ¶
DefaultBranch returns the name of the remote's default branch
func (*Remote) Fetch ¶
func (r *Remote) Fetch(req *common.GitUploadPackRequest) (io.ReadCloser, error)
Fetch returns a reader using the request
func (*Remote) FetchDefaultBranch ¶
func (r *Remote) FetchDefaultBranch() (io.ReadCloser, error)
FetchDefaultBranch returns a reader for the default branch
func (*Remote) Info ¶
func (r *Remote) Info() *common.GitUploadPackInfo
Info returns the git-upload-pack info
type Repository ¶
type Repository struct { Remotes map[string]*Remote Storage core.ObjectStorage URL string }
func NewPlainRepository ¶
func NewPlainRepository() *Repository
NewPlainRepository creates a new repository without remotes
func NewRepository ¶
func NewRepository(url string, auth common.AuthMethod) (*Repository, error)
NewRepository creates a new repository setting remote as default remote
func (*Repository) Blob ¶
func (r *Repository) Blob(h core.Hash) (*Blob, error)
Blob returns the blob with the given hash
func (*Repository) Commit ¶
func (r *Repository) Commit(h core.Hash) (*Commit, error)
Commit return the commit with the given hash
func (*Repository) Commits ¶
func (r *Repository) Commits() *CommitIter
Commits decode the objects into commits
func (*Repository) Pull ¶
func (r *Repository) Pull(remoteName, branch string) (err error)
Pull connect and fetch the given branch from the given remote, the branch should be provided with the full path not only the abbreviation, eg.: "refs/heads/master"
func (*Repository) Tag ¶
func (r *Repository) Tag(h core.Hash) (*Tag, error)
Tag returns a tag with the given hash.
func (*Repository) Tags ¶
func (r *Repository) Tags() *TagIter
Tags returns a TagIter that can step through all of the annotated tags in the repository.
type Signature ¶
Signature represents an action signed by a person
type Tag ¶
type Tag struct { Hash core.Hash Type core.ObjectType Name string Tagger Signature Message string // contains filtered or unexported fields }
Tag represents an annotated tag object. It points to a single git object of any type, but tags typically are applied to commit or blob objects. It provides a reference that associates the target with a tag name. It also contains meta-information about the tag, including the tagger, tag date and message.
https://git-scm.com/book/en/v2/Git-Internals-Git-References#Tags
func (*Tag) Blob ¶
Blob returns the blob pointed to by the tag. If the tag points to a different type of object ErrUnsupportedObject will be returned.
func (*Tag) Commit ¶
Commit returns the commit pointed to by the tag. If the tag points to a different type of object ErrUnsupportedObject will be returned.
type TagIter ¶
type TagIter struct { core.ObjectIter // contains filtered or unexported fields }
TagIter provides an iterator for a set of tags.
func NewTagIter ¶
func NewTagIter(r *Repository, iter core.ObjectIter) *TagIter
NewTagIter returns a new TagIter for the given Repository and ObjectIter.
type Tree ¶
Tree is basically like a directory - it references a bunch of other trees and/or blobs (i.e. files and sub-directories)
type TreeEntryIter ¶
type TreeEntryIter struct {
// contains filtered or unexported fields
}
TreeEntryIter facilitates iterating through the TreeEntry objects in a Tree.
func NewTreeEntryIter ¶
func NewTreeEntryIter(t *Tree) *TreeEntryIter
func (*TreeEntryIter) Next ¶
func (iter *TreeEntryIter) Next() (TreeEntry, error)
type TreeIter ¶
type TreeIter struct {
// contains filtered or unexported fields
}
TreeEntryIter facilitates iterating through the descendent subtrees of a Tree.
func NewTreeIter ¶
func NewTreeIter(r *Repository, t *Tree) *TreeIter
type TreeWalker ¶
type TreeWalker struct {
// contains filtered or unexported fields
}
TreeWalker provides a means of walking through all of the entries in a Tree.
func NewTreeWalker ¶
func NewTreeWalker(r *Repository, t *Tree) *TreeWalker
NewTreeWalker returns a new TreeWalker for the given repository and tree.
It is the caller's responsibility to call Close() when finished with the tree walker.
func (*TreeWalker) Close ¶
func (w *TreeWalker) Close()
Close releases any resources used by the TreeWalker.
func (*TreeWalker) Next ¶
Next returns the next object from the tree. Objects are returned in order and subtrees are included. After the last object has been returned further calls to Next() will return io.EOF.
In the current implementation any objects which cannot be found in the underlying repository will be skipped automatically. It is possible that this may change in future versions.
func (*TreeWalker) Tree ¶
func (w *TreeWalker) Tree() *Tree
Tree returns the tree that the tree walker most recently operated on.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Go-git needs the packfile and the refs of the repo.
|
Go-git needs the packfile and the refs of the repo. |
common
Package common contains utils used by the clients
|
Package common contains utils used by the clients |
http
Package http implements a HTTP client for go-git.
|
Package http implements a HTTP client for go-git. |
ssh
Package ssh implements a ssh client for go-git.
|
Package ssh implements a ssh client for go-git. |
Package core implement the core interfaces and structs used by go-git
|
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.
|
Package diff implements line oriented diffs, similar to the ancient Unix diff command. |
examples
|
|
formats
|
|
storage
|
|