# 如何成为 Golang 贡献者

- Link: https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/
- Published: 2021-08-21T09:54:45+08:00
- Author: 白宦成

文章目录

 [Toggle](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#)

 * [贡献流程](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#%e8%b4%a1%e7%8c%ae%e6%b5%81%e7%a8%8b)
    - [0. 系统依赖](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#0_%e7%b3%bb%e7%bb%9f%e4%be%9d%e8%b5%96)
    - [1. 找到你要贡献的问题](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#1_%e6%89%be%e5%88%b0%e4%bd%a0%e8%a6%81%e8%b4%a1%e7%8c%ae%e7%9a%84%e9%97%ae%e9%a2%98)
    - [2. 签署 Golang CLA，配置基本信息](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#2_%e7%ad%be%e7%bd%b2_golang_cla%ef%bc%8c%e9%85%8d%e7%bd%ae%e5%9f%ba%e6%9c%ac%e4%bf%a1%e6%81%af)
    - [3. 配置 Password 、Git 等信息](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#3_%e9%85%8d%e7%bd%ae_password_%e3%80%81git_%e7%ad%89%e4%bf%a1%e6%81%af)
    - [4. 安装 Code Review 工具](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#4_%e5%ae%89%e8%a3%85_code_review_%e5%b7%a5%e5%85%b7)
    - [5. Clone 代码并提交贡献](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#5_clone_%e4%bb%a3%e7%a0%81%e5%b9%b6%e6%8f%90%e4%ba%a4%e8%b4%a1%e7%8c%ae)
       * [5.1 clone 代码并执行测试](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#51_clone_%e4%bb%a3%e7%a0%81%e5%b9%b6%e6%89%a7%e8%a1%8c%e6%b5%8b%e8%af%95)
       * [5.2 修改代码](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#52_%e4%bf%ae%e6%94%b9%e4%bb%a3%e7%a0%81)
       * [5.3 提交代码](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#53_%e6%8f%90%e4%ba%a4%e4%bb%a3%e7%a0%81)
    - [6. 进行 Code Review](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#6_%e8%bf%9b%e8%a1%8c_code_review)
 * [一些注意的点](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#%e4%b8%80%e4%ba%9b%e6%b3%a8%e6%84%8f%e7%9a%84%e7%82%b9)
    - [1. 关于中国区无法提交的问题](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#1_%e5%85%b3%e4%ba%8e%e4%b8%ad%e5%9b%bd%e5%8c%ba%e6%97%a0%e6%b3%95%e6%8f%90%e4%ba%a4%e7%9a%84%e9%97%ae%e9%a2%98)
    - [2. Commit Message 格式](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#2_commit_message_%e6%a0%bc%e5%bc%8f)
 * [相关链接](https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#%e7%9b%b8%e5%85%b3%e9%93%be%e6%8e%a5)

是的，我成为了 Golang contributor

![](https://postimg.aliavv.com/mbp2021/bzii6.png)

我的第一个 [contribution](https://go-review.googlesource.com/c/go/+/343969)

在听完了 [Go 夜聊](https://talkgo.fm/)的第 2 期播客后，我突然觉得，嗯，我是应该加入
一个社区，而不是总是以一个创建者的身份去创建开源项目。可以有一个新的视角。

于是，我选择了加入我最常写的三种语言其一的 Golang。

然后接下来的问题就是，**应该如何做贡献？**

我查阅了一些资料，完成了此次贡献。并将其记录在此，希望可以帮到你。

## 贡献流程

### 0. 系统依赖

给 Golang 做贡献需要一些基本配置，这里不再赘述，只写明要求：

 * 安装了 Golang
 * 安装了 Git

### 1. 找到你要贡献的问题

实际上，既然要贡献，首先你要解决的问题是，你想贡献什么问题？绝大多数的贡献都是基于
某一个特定的问题进行的。

### 2. 签署 Golang CLA，配置基本信息

golang 的贡献是基于 Git 进行的，因此，你在贡献前，需要确保你的各项基本信息是复合
要求的。比如，你要在[**网站**](https://developers.google.com/open-source/cla/individual)
上签署 CLA（Contributor License Agreement）；你的 Git Username 和 Git Email 应该
符合和你签署 CLA 的信息是符合的。

签署完成后，可以使用你的 Google 账号登陆 [https://go-review.googlesource.com/login/](https://go-review.googlesource.com/login/)，
注册一个账号。后续的 Code Review 也会在这里进行。

### 3. 配置 Password 、Git 等信息

> 需要注意的是，目前 Golang 无法从中国大陆提交贡献，所以你应该在一台海外服务器上
> 进行贡献。以确保可以提交。想了解具体情况，可以查看附录中的 GitHub issue #20065
> Golang 在提交时，是通过 Git 提交的，不过和一般我们常用的 HTTP 账号密码鉴权 or 
> Key 鉴权不同，Golang 采用的是 GitCookies 进行提交的。因此，你需要配置 Git Cookies。

访问 [go Git repositories – Git at Google (googlesource.com)](https://go.googlesource.com/)，
登陆后，点击右上角的 **Generate Password**

![](https://postimg.aliavv.com/mbp2021/wrtzn.png)

点击这里

在新的页面中,复制下方蓝色框体中的 bash 代码，并粘贴在你的 Shell 中粘贴并执行，即可
配置好 Git Cookies

![](https://postimg.aliavv.com/mbp2021/vzgh3.png)

蓝框里本来是 Shell 命令，被我 F12 给改了

### 4. 安装 Code Review 工具

在服务器上执行如下命令，安装代码提交工具

    ```javascript
    go get -u golang.org/x/review/git-codereview
    Code language: JavaScript (javascript)
    ```

安装完成后，执行如下命令验证

    ```shcb-line-numbers
    git-codereview help
    ```

### 5. Clone 代码并提交贡献

接下来的就很简单了，和我们日常贡献代码很接近了

#### 5.1 clone 代码并执行测试

首先你需要 clone 代码，并执行测试，确保你 clone 的代码本身是没问题的（不然可能会
出现你改了一大堆，发现问题不是你自己的）

    ```php
    git clone https://go.googlesource.com/go
    cd go/src
    <meta charset="utf-8">./all.bash # 执行测试，如果看到 ALL TESTS PASSED 则说明代码没问题。
    Code language: PHP (php)
    ```

#### 5.2 修改代码

修改代码按照我们一般的分支协作的方式来进行即可

    ```php
    git checkout -b feat/xxxx
    # 修改文件...
    git add [files...]
    git codereview change # 为你的贡献创建一个 commit
    Code language: PHP (php)
    ```

#### 5.3 提交代码

完成代码贡献后，你就可以准备提交你的代码了。不过，你还是要跑一次测试，确保你的修改
没有导致某些地方坏掉。

    ```php
    ./all.bash # 执行测试，如果看到 ALL TESTS PASSED 则说明代码没问题。
     git codereview mail  #提交你的代码
    Code language: PHP (php)
    ```

### 6. 进行 Code Review

提交完成后，你就会在 https://go-review.googlesource.com/ 上有一个新的 Change 的记录，
然后系统会自动帮你分配 Maintainer 进行 Review，这个阶段如果 Reviewer 没有给你提出
需要修改的话，你只需要等待你的代码被合并即可。

![](https://postimg.aliavv.com/mbp2021/yl90z.png)

需要注意的是，Golang 对于代码的合并有要求，需要 2 个 **+2** 才能合并到代码库中。
因此，你的代码可能会很快被某个 Maintainer Review，但很久才被另外一个 Maintainer 
Review （其实也没多久，只是相比于第一个）

当两个都合并完成后，左上角的标识就会变成 Merged ，此时就说明你的代码贡献成功啦！

![](https://postimg.aliavv.com/mbp2021/v573a.png)

## 一些注意的点

### 1. 关于中国区无法提交的问题

如果你使用自己的本地电脑进行提交，你会发现，你会收到一个报错

> Access Denied (not available from your location)

这是因为 Golang 官方禁止了中国区的提交，将 golang 源码对于中国区进行了只读状态的
设置。

这并不是 Golang 不欢迎中国开发者贡献，只是对于 GFW 封禁 golang.org 的一种抵抗。

![](https://postimg.aliavv.com/mbp2021/iebps.png)

Maintainer 的解释

你只需要将贡献环境从你的本地电脑，换成任何一个海外的服务器，就可以正常提交。

来源：[access to Gerrit denied because of location · Issue #20065 · golang/go (github.com)](https://github.com/golang/go/issues/20065)

### 2. Commit Message 格式

golang 的 commet message 有自己的格式，你在提交的时候可以以这个格式进行提交，这样
后续就不需要 Reviewer 帮你改了。

    ```shcb-line-numbers
    [模块] 修改内容
    详细信息
    Github link
    Code language: CSS (css)
    ```

给大家举个例子，大家就知道是什么样的了。首先，下面这个是我自己的 commit message

    ```shcb-line-numbers
    typo: fix reponse to response in src/net/http/header.go
    Change-Id: I238bc90c4f273c352ef924989a44c6e927839128
    Code language: HTTP (http)
    ```

Reviewer 帮我调整后的格式

    ```shcb-line-numbers
    net/http: fix typo in header.go
    Change-Id: Ia6df881badf9a704c7f56967404d37e230b88a09
    Reviewed-on: https://go-review.googlesource.com/c/go/+/343969
    Reviewed-by: Damien Neil <dneil@google.com>
    Reviewed-by: Ian Lance Taylor <iant@golang.org>
    Trust: Damien Neil <dneil@google.com>
    Code language: HTTP (http)
    ```

更加简单明了。

_Change ID、Reviewed on、Reviewed by 是系统自动添加的，你不需要关注。_

来源：[Contribution Guide – The Go Programming Language (google.cn)](https://golang.google.cn/doc/contribute#commit_messages)

## 相关链接

 * [Contribution Guide – The Go Programming Language (google.cn)](https://golang.google.cn/doc/contribute)

## Comments

### By: sd1

- Link: https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#comment-291
- Published: 2021-08-23T01:30:55+08:00

读完了老白所有的博客文章，完结撒花\~

### By: kira

- Link: https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#comment-292
- Published: 2021-08-24T08:54:43+08:00

恭喜成为 golang 贡献者！
 我也想找一个开源项目参与一下了，不过总觉得起步好麻烦，
哈哈。 另外发现一处错误（如果不是故意的话）。”我的第一个 contribution” 处 contribution
的 href attribute 的值是字符串”typo: fix typo in src/net/http/header.go (Ia6df881b)%
C2%B7 Gerrit Code Review (googlesource.com)”，我想你本来是想写你提交的 commit 的
链接吧，类似 [https://github.com/golang/go/commit/5045477be8961af1a5855d89e60483f4ccb624ac#diff-f9cc0f2c6952d4d7064e7d56f17858ba5dda888d3b79f4c9e3043be339046ae1](https://github.com/golang/go/commit/5045477be8961af1a5855d89e60483f4ccb624ac#diff-f9cc0f2c6952d4d7064e7d56f17858ba5dda888d3b79f4c9e3043be339046ae1)
之类的。

### By: 白 宦成

- Link: https://www.ixiqin.com/2021/08/21/how-to-become-golang-contributors/#comment-293
- Published: 2021-08-24T14:49:45+08:00

确实是我搞错了，我更新一下链接。
