一般来说,我们在使用一些开源库的时候难免会发现某些库存在一些 BUG 或者可优化的点,甚至自己需要为其添加特别的功能来满足自己的需求。于是出于开源奉献精神,能为其提供几段代码来解决一些 BUG 或者添加一些合适的新功能来满足大众的需求还是一个比较好的回馈社区的做法。那么在 Github 或者 Gitlab 上为开源项目贡献代码的一般工作流程是怎样的呢?

  1. 仔细阅读项目的 README 内容,有些项目会给出贡献代码的规范或者说明,比如 GoogleChrome/puppeteer,请务必仔细阅读;
  2. 对于没有给出说明的项目,一般都会接受 Pull/Merge Request。

一般工作流程

github.com/scrooloose/nerdtree 为例:

1. fork to github.com/ggicci/nerdtree
2. git clone git@github.com:ggicci/nerdtree.git
3. write your code ...
4. git commit && git push
5. open a pull request

推荐工作流程

大多数情况下是可行的,一般工作流程也就基本上满足需求了,但是也会有例外。这一般是因为项目源码或者其执行环境依赖项目名造成的,比如 fork 后项目名(路径)由 github.com/userA/foo 变成 github.com/userB/foo,造成项目不可解析、不可编译、不可执行等问题。典型的像 Go 语言的项目,其包管理和 import 指令依赖项目名(路径),所以当你 Fork 了一个 Go 项目后,大多数情况下得到的是一个不可用版本,只要该项目有子包,且被 import

所以推荐还是保留原始项目的环境,也就是 Clone 原始项目的源码,然后在其源码上做更改,这样就能避免各种各样的问题。

这里拿 github.com/gorilla/mux 为例:

1. fork to github.com/ggicci/mux
2. git clone git@github.com:gorilla/mux.git
3. git remote rename origin upstream
4. git remote add origin git@github.com:ggicci/mux.git
5. write your code ...
6. git commit && git push origin
7. open a pull request

我习惯把原始项目作为 upstream,自己 fork 的项目作为 origin,参考 SO: What is the difference between origin and upstream on GitHub?

Github Open Source Contribution Workflow