想為開源項目貢獻你的代碼嗎?這裡告訴你該如何入手。

本文以 emacs 項目為例。
<a></a>
郵件清單的郵件量一般都比較大,尤其是加入了多個項目的郵件清單後,不僅資訊多,還很雜亂,是以建議:
然後把代碼拉回本地:
<code>$ git clone git://git.sv.gnu.org/emacs.git -b emacs-25</code>
emacs 有很多分支,目前的開發主要在 emacs-25 這個分支上進行,是以上面指令我是從 emacs-25 分支上拉取的代碼。
一段時間後維護者會把代碼合并到 master 分支中。
如果之前已經拉過代碼了,在修改前記得 pull 一次來保持代碼是最新的:
<code>$ git pull</code>
不要在目前分支上修改代碼,理由有很多,比如官方不一定接受你的 patch。而是對每修一個 bug 都建立一個分支:
<code>$ git checkout -b tramp-sh-add-doas --track emacs-25</code>
這行指令我建立了一個叫“tramp-sh-add-doas”的分支,取名要有含義,尤其是你在要修複多個 bug 時好區分。這個名字的含義是為了在 tramp-sh 裡增加 doas 指令的支援。
接下來是漫長的編碼階段,主要注意兩點:
編碼風格統一,最簡單的方法就是看看同檔案裡别人是怎麼寫的,他的縮進、命名、花括号位置等等。
不要去修改無關的代碼,比如去動了其他位置的縮進等等。不然維護者會很疑惑。
代碼寫完後,commit 一下:
<code>$ git commit -a</code>
寫一段好的 commit 也很重要,最簡單的方法就是執行 git log,看别人怎麼寫的。一般 commit 的第一行寫清楚你本次修改是做了什麼,再空一行,逐行列出增加、修改的函數和變量等,讓開發者一目了然,比如:
<code>author: xi lu <[email protected]></code>
<code>date: fri dec 11 10:52:08 2015 +0200</code>
<code></code>
<code>initial support for ruby in 'etags'</code>
<code>* lib-src/etags.c <ruby_suffixes>: new variable.</code>
<code>(lang_names): add an entry for ruby.</code>
<code>(ruby_functions): new function. (bug#22116)</code>
送出 commit 後,執行以下指令生成一個 patch 檔案:
<code>$ git format-patch emacs-25</code>
這行指令會把目前分支修改的内容和 emacs-25 分支做 diff,然後在目前目錄下生成一個 diff 檔案,如:0001-add-support-for-doas-command.patch。
生成的 patch 檔案是需要發到郵件清單裡,相關檔案的維護者會跟你溝通并合并到代碼倉庫中的,和 github 上直接發 pull request 來比,就沒那麼幸福了。
最後,把更新檔發送到郵件清單去(這裡或許你需要配置一下 git 的發送郵件,請自行找資料):
<code>git send-email [email protected] 更新檔檔案1 更新檔檔案2 更新檔檔案..</code>
之後 gnu 的 bug 跟蹤系統會确認你的 bug,并給你送出的 bug 配置設定一個 id,然後自動回複一封郵件給你:
開發者和你進一步溝通,完畢之後會關閉這個 bug,并把代碼合并到倉庫中去。
你的代碼在合并到倉庫之前可能還會有一道障礙,直到清除障礙後代碼才可以進入倉庫——簽協定。
簽協定的主要目的是證明代碼由你所寫,沒有侵犯到其他版權,并且版權歸給 fsf。
如果你送出的代碼确實需要簽檔案,開發者會郵件回你一個申請表模闆,讓你按模闆内容填寫一封申請郵件給 fsf 來申請簽協定檔案的。
模闆内容如下(注:“#”是我自行添加的注解):
<code>----------------------------------------------------------------------</code>
<code>request: send form for past and future changes</code>
<code>[what is the name of the program or package you're contributing to?]</code>
<code># 你貢獻的項目名稱,比如emacs。</code>
<code># 注意一個項目隻能簽一份協定,如果你這裡寫多個項目,就需要簽多份協定。</code>
<code>[did you copy any files or text written by someone else in these changes?</code>
<code>even if that material is free software, we need to know about it.]</code>
<code># 解釋你貢獻的代碼裡是否用了其他項目代碼,如果有就列一下。</code>
<code>[do you have an employer who might have a basis to claim to own</code>
<code>your changes? do you attend a school which might make such a claim?]</code>
<code># 是不是以你個人名義來送出代碼的,是的話就寫no。</code>
<code># 如果是公司名義,好像需要公司和fsf再簽協定,這個流程我不熟悉。</code>
<code>[for the copyright registration, what country are you a citizen of?]</code>
<code># 一般就寫china。</code>
<code>[what year were you born?]</code>
<code># 你生日。</code>
<code>[please write your email address here.]</code>
<code># 你郵件位址。</code>
<code>[please write your postal address here.]</code>
<code># 通信位址,需要寫詳細點。</code>
<code>[which files have you changed so far, and which new files have you written</code>
<code>so far?]</code>
<code># 你改變了哪些檔案,列出來。</code>
把這封郵件發給 [email protected], 郵件标題是你真實的姓名 ,郵件内容就是上面模闆填寫後的内容。
然後 fsf 會稽核你的申請,一般需要幾天。稽核通過後他們會給你發一封郵件,讓你将附件的 pdf 檔案列印下來,然後簽字,簽上你的名字(不要用中文),以及寫好日期(日期的月份需要用英文,不要用數字,如:2015 december 30)。
接下來,把簽完的紙質協定寄到美國去。你可以去淘寶找 dhl 快遞代收,dhl 大概3天就到了,費用大概是¥140~¥160之間。
他們收到你的紙質協定後也會簽字,需要等幾天,具體周期視他們處理情況而定,如果你等了兩周都還沒回你,那麼你可以回郵件問問怎麼回事,比如我的就正好遇到聖誕節放假。
最後,他們會把簽字後的掃描件以 pdf 格式發送到你的郵箱,整個過程算是結束了。
如果你換了工作,也請告知他們,有可能會涉及到協定重簽,比如你到了新公司,給他們送出的代碼不再是個人性質。
happy hacking。
xue fuqiao、eli zaretskii
本文來自雲栖社群合作夥伴“linux中國”
原文釋出時間為:2013-04-02.