| # Contributing to Go Protocol Buffers | |
| Go protocol buffers is an open source project and accepts contributions. | |
| The source of truth for this repository is at | |
| [go.googlesource.com/protobuf](https://go.googlesource.com/protobuf). | |
| The code review tool used is | |
| [Gerrit Code Review](https://www.gerritcodereview.com/). | |
| At this time, we are unfortunately unable to accept GitHub pull requests. | |
| ## Becoming a contributor | |
| The first step is to configure your environment. | |
| Please follow the steps outlined in | |
| ["Becoming a contributor" (golang.org)](https://golang.org/doc/contribute.html#contributor) | |
| as the setup for contributing to the `protobuf` project is largely the same as | |
| that for contributing to the `go` project. | |
| The project's tests also require Bazel. See http://bazel.build/install for | |
| installation instructions. | |
| ## Before contributing code | |
| The project welcomes submissions, but to make sure things are well coordinated | |
| we ask that contributors discuss any significant changes before starting work. | |
| Best practice is to connect your work to the | |
| [issue tracker](https://github.com/golang/protobuf/issues), | |
| either by filing a new issue or by claiming an existing issue. | |
| ## Sending a change via Gerrit | |
| The `protobuf` project performs development in Gerrit. | |
| Below are the steps to send a change using Gerrit. | |
| **Step 1:** Clone the Go source code: | |
| ``` | |
| $ git clone https://go.googlesource.com/protobuf | |
| ``` | |
| **Step 2:** Setup a Git hook: | |
| Setup a hook to run the tests prior to submitting changes to Gerrit: | |
| ``` | |
| $ (cd protobuf/.git/hooks && echo -e '#!/bin/bash\n./test.bash' > pre-push && chmod a+x pre-push) | |
| ``` | |
| **Step 3:** Prepare changes in a new branch, created from the `master` branch. | |
| To commit the changes, use `git codereview change`; | |
| that will create or amend a single commit in the branch. | |
| ``` | |
| $ git checkout -b mybranch | |
| $ [edit files...] | |
| $ git add [files...] | |
| $ git codereview change # create commit in the branch | |
| $ [edit again...] | |
| $ git add [files...] | |
| $ git codereview change # amend the existing commit with new changes | |
| $ [etc.] | |
| ``` | |
| **Step 4:** Send the changes for review to Gerrit using `git codereview mail`. | |
| ``` | |
| $ git codereview mail # send changes to Gerrit | |
| ``` | |
| **Step 5:** After a review, there may be changes that are required. | |
| Do so by applying changes to the same commit and mail them to Gerrit again: | |
| ``` | |
| $ [edit files...] | |
| $ git add [files...] | |
| $ git codereview change # update same commit | |
| $ git codereview mail # send to Gerrit again | |
| ``` | |
| When calling `git codereview mail`, it will call `git push` under the hood, | |
| which will trigger the test hook that was setup in step 2. | |
| The [Contribution Guidelines](https://golang.org/doc/contribute.html) for the | |
| Go project provides additional details that are also relevant to | |
| contributing to the Go `protobuf` project. |