| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
jopen
9年前发布

一个低层和高可扩展的Git客户端Go库:go-git

go-git

一个低层和高可扩展的git客户端库用于读取来自git服务器的仓库。它采用Go从头开始开发,没有任何C依赖。

We have been following the open/close principle in its design to facilitate extensions.

go-git does not claim to be a replacement of git2go as its approach and functionality is quite different.

ok, but why? ...

At source{d} we analyze almost all the public open source contributions made to git repositories in the world.

We want to extract detailed information from each GitHub repository, which requires downloading repository packfiles and analyzing them: extracting their code, authors, dates and the languages and ecosystems they use. We are also interested in knowing who contributes to what, so we can tell top contributors from the more casual ones.

You can obtain all this information using the standard git command running over a local clone of a repository, but this simple solution does not scale well over millions of repositories: we want to avoid having local copies of the unpacked repositories in a regular file system; go-git allows us to work with an in-memory representation of repositories instead.

I see... but this is production ready?

Yes!!!, we have been using go-git at source{d} since August 2015 to analyze all GitHub public repositories (i.e. 16M of repositories).

Coming Soon

Blame support: right now we are using a forward version of a line-tracking algorithm and we are having some problems handling merges. The plan is to get merges right and change to a backward line-tracking algorithm soon.

Installation

The recommended way to install go-git is:

go get -u gopkg.in/src-d/go-git.v2/...

Examples

Basic example: retrieving the commits for a given repository:

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)  }

Outputs:

commit 2275fa7d0c75d20103f90b0e1616937d5a9fc5e6  Author: Máximo Cuadros <mcuadros@gmail.com>  Date:   2015-10-23 00:44:33 +0200 +0200    commit 35b585759cbf29f8ec428ef89da20705d59f99ec  Author: Carlos Cobo <toqueteos@gmail.com>  Date:   2015-05-20 15:21:37 +0200 +0200    commit 7e3259c191a9de23d88b6077dcb1cd427e925432  Author: Alberto Cortés <alberto@sourced.tech>  Date:   2016-01-21 03:29:57 +0100 +0100    commit 24b8ae50db91f3909b11304014564bffc6fdee79  Author: Alberto Cortés <alberto@sourced.tech>  Date:   2015-12-11 17:57:10 +0100 +0100  ...

Acknowledgements

The earlier versions of the packfile reader are based on git-chain, project done by @yrashk

License

MIT, see LICENSE


项目地址: https://github.com/src-d/go-git

 本文由用户 jopen 自行上传分享,仅供网友学习交流。所有权归原作者,若您的权利被侵害,请联系管理员。
 转载本站原创文章,请注明出处,并保留原始链接、图片水印。
 本站是一个以用户分享为主的开源技术平台,欢迎各类分享!
 本文地址:https://www.open-open.com/lib/view/open1455688819948.html
Google Go/Golang开发