Máximo Cuadros | a0a0ec7 | 2020-03-16 09:58:15 | [diff] [blame] | 1 | ## WE CONTINUE THE DEVELOPMENT AT [go-git/go-git](https://github.com/go-git/go-git). This repository is abandoned, and no further updates will be done on the code base, nor issue/prs will be answered or attended. |
| 2 | |
Máximo Cuadros | 110e701 | 2017-12-18 09:29:29 | [diff] [blame] | 3 |  |
| 4 | [](https://godoc.org/github.com/src-d/go-git) [](https://travis-ci.org/src-d/go-git) [](https://ci.appveyor.com/project/mcuadros/go-git) [](https://codecov.io/github/src-d/go-git) [](https://goreportcard.com/report/github.com/src-d/go-git) |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 5 | |
Máximo Cuadros | 110e701 | 2017-12-18 09:29:29 | [diff] [blame] | 6 | *go-git* is a highly extensible git implementation library written in **pure Go**. |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 7 | |
hnarasaki | 1a2248b | 2018-10-17 10:01:11 | [diff] [blame] | 8 | 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 the [`Storer`](https://godoc.org/gopkg.in/src-d/go-git.v4/plumbing/storer) interface. |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 9 | |
Lukasz Kokot | 190bfd6 | 2018-10-29 00:55:22 | [diff] [blame] | 10 | It's being actively developed since 2015 and is being used extensively by [source{d}](https://sourced.tech/) and [Keybase](https://keybase.io/blog/encrypted-git-for-everyone), and by many other libraries and tools. |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 11 | |
Máximo Cuadros | 110e701 | 2017-12-18 09:29:29 | [diff] [blame] | 12 | Comparison with git |
| 13 | ------------------- |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 14 | |
Máximo Cuadros | 110e701 | 2017-12-18 09:29:29 | [diff] [blame] | 15 | *go-git* aims to be fully compatible with [git](https://github.com/git/git), all the *porcelain* operations are implemented to work exactly as *git* does. |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 16 | |
Lukasz Kokot | 190bfd6 | 2018-10-29 00:55:22 | [diff] [blame] | 17 | *git* is a humongous project with years of development by thousands of contributors, making it challenging for *go-git* to implement all the features. You can find a comparison of *go-git* vs *git* in the [compatibility documentation](COMPATIBILITY.md). |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 18 | |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 19 | |
| 20 | Installation |
| 21 | ------------ |
| 22 | |
| 23 | The recommended way to install *go-git* is: |
| 24 | |
| 25 | ``` |
Antonio Jesus Navarro Perez | 33e7c16 | 2017-03-07 11:58:18 | [diff] [blame] | 26 | go get -u gopkg.in/src-d/go-git.v4/... |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 27 | ``` |
| 28 | |
Lukasz Kokot | 190bfd6 | 2018-10-29 00:55:22 | [diff] [blame] | 29 | > We use [gopkg.in](http://labix.org/gopkg.in) to version the API, this means that when `go get` clones the package, it's the latest tag matching `v4.*` that is cloned and not the master branch. |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 30 | |
| 31 | Examples |
| 32 | -------- |
| 33 | |
Lukasz Kokot | 190bfd6 | 2018-10-29 00:55:22 | [diff] [blame] | 34 | > Please note that the `CheckIfError` and `Info` functions used in the examples are from the [examples package](https://github.com/src-d/go-git/blob/master/_examples/common.go#L17) just to be used in the examples. |
Máximo Cuadros | 40875ee | 2016-12-13 15:01:35 | [diff] [blame] | 35 | |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 36 | |
Máximo Cuadros | 2308066 | 2017-01-31 13:43:49 | [diff] [blame] | 37 | ### Basic example |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 38 | |
Máximo Cuadros | 2308066 | 2017-01-31 13:43:49 | [diff] [blame] | 39 | A basic example that mimics the standard `git clone` command |
| 40 | |
| 41 | ```go |
| 42 | // Clone the given repository to the given directory |
| 43 | Info("git clone https://github.com/src-d/go-git") |
| 44 | |
| 45 | _, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{ |
| 46 | URL: "https://github.com/src-d/go-git", |
| 47 | Progress: os.Stdout, |
| 48 | }) |
| 49 | |
| 50 | CheckIfError(err) |
| 51 | ``` |
| 52 | |
| 53 | Outputs: |
| 54 | ``` |
| 55 | Counting objects: 4924, done. |
| 56 | Compressing objects: 100% (1333/1333), done. |
| 57 | Total 4924 (delta 530), reused 6 (delta 6), pack-reused 3533 |
| 58 | ``` |
| 59 | |
| 60 | ### In-memory example |
| 61 | |
| 62 | Cloning a repository into memory and printing the history of HEAD, just like `git log` does |
| 63 | |
| 64 | |
| 65 | ```go |
| 66 | // Clones the given repository in memory, creating the remote, the local |
| 67 | // branches and fetching the objects, exactly as: |
Máximo Cuadros | 40875ee | 2016-12-13 15:01:35 | [diff] [blame] | 68 | Info("git clone https://github.com/src-d/go-siva") |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 69 | |
Máximo Cuadros | 2308066 | 2017-01-31 13:43:49 | [diff] [blame] | 70 | r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{ |
| 71 | URL: "https://github.com/src-d/go-siva", |
| 72 | }) |
| 73 | |
Máximo Cuadros | 40875ee | 2016-12-13 15:01:35 | [diff] [blame] | 74 | CheckIfError(err) |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 75 | |
Lukasz Kokot | 190bfd6 | 2018-10-29 00:55:22 | [diff] [blame] | 76 | // Gets the HEAD history from HEAD, just like this command: |
Máximo Cuadros | 40875ee | 2016-12-13 15:01:35 | [diff] [blame] | 77 | Info("git log") |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 78 | |
Máximo Cuadros | 40875ee | 2016-12-13 15:01:35 | [diff] [blame] | 79 | // ... retrieves the branch pointed by HEAD |
| 80 | ref, err := r.Head() |
| 81 | CheckIfError(err) |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 82 | |
Máximo Cuadros | 40875ee | 2016-12-13 15:01:35 | [diff] [blame] | 83 | |
| 84 | // ... retrieves the commit history |
Eiso Kant | 63df181 | 2017-11-29 15:01:49 | [diff] [blame] | 85 | cIter, err := r.Log(&git.LogOptions{From: ref.Hash()}) |
Máximo Cuadros | 40875ee | 2016-12-13 15:01:35 | [diff] [blame] | 86 | CheckIfError(err) |
| 87 | |
| 88 | // ... just iterates over the commits, printing it |
Eiso Kant | 63df181 | 2017-11-29 15:01:49 | [diff] [blame] | 89 | err = cIter.ForEach(func(c *object.Commit) error { |
| 90 | fmt.Println(c) |
| 91 | return nil |
| 92 | }) |
| 93 | CheckIfError(err) |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 94 | ``` |
| 95 | |
| 96 | Outputs: |
| 97 | ``` |
Máximo Cuadros | c9353b2 | 2016-12-16 20:53:40 | [diff] [blame] | 98 | commit ded8054fd0c3994453e9c8aacaf48d118d42991e |
| 99 | Author: Santiago M. Mola <[email protected]> |
| 100 | Date: Sat Nov 12 21:18:41 2016 +0100 |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 101 | |
Máximo Cuadros | c9353b2 | 2016-12-16 20:53:40 | [diff] [blame] | 102 | index: ReadFrom/WriteTo returns IndexReadError/IndexWriteError. (#9) |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 103 | |
Máximo Cuadros | c9353b2 | 2016-12-16 20:53:40 | [diff] [blame] | 104 | commit df707095626f384ce2dc1a83b30f9a21d69b9dfc |
| 105 | Author: Santiago M. Mola <[email protected]> |
| 106 | Date: Fri Nov 11 13:23:22 2016 +0100 |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 107 | |
Máximo Cuadros | c9353b2 | 2016-12-16 20:53:40 | [diff] [blame] | 108 | readwriter: fix bug when writing index. (#10) |
| 109 | |
| 110 | When using ReadWriter on an existing siva file, absolute offset for |
| 111 | index entries was not being calculated correctly. |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 112 | ... |
| 113 | ``` |
| 114 | |
Lukasz Kokot | 190bfd6 | 2018-10-29 00:55:22 | [diff] [blame] | 115 | You can find this [example](_examples/log/main.go) and many others in the [examples](_examples) folder. |
Santiago M. Mola | 6c7871b | 2017-05-09 15:42:56 | [diff] [blame] | 116 | |
Máximo Cuadros | 40875ee | 2016-12-13 15:01:35 | [diff] [blame] | 117 | Contribute |
| 118 | ---------- |
Máximo Cuadros | bcefb5b | 2016-04-25 07:01:28 | [diff] [blame] | 119 | |
Máximo Cuadros | 110e701 | 2017-12-18 09:29:29 | [diff] [blame] | 120 | [Contributions](https://github.com/src-d/go-git/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) are more than welcome, if you are interested please take a look to |
| 121 | our [Contributing Guidelines](CONTRIBUTING.md). |
Máximo Cuadros | aab1853 | 2016-02-16 12:37:47 | [diff] [blame] | 122 | |
Máximo Cuadros | 579d1ac | 2016-02-16 12:22:25 | [diff] [blame] | 123 | License |
| 124 | ------- |
Máximo Cuadros | 110e701 | 2017-12-18 09:29:29 | [diff] [blame] | 125 | Apache License Version 2.0, see [LICENSE](LICENSE) |