如何給 GNU 專案貢獻程式碼
想為開源專案貢獻你的程式碼嗎?這裡告訴你該如何入手。
本文以 Emacs 專案為例。
1、訂閱郵件列表
GNU 的專案都通過郵件列表和全世界的貢獻者交流,所以你應該先去 https://lists.gnu.org/mailman/listinfo 找到相應專案的郵件列表。一般建議加入 bug 和 devel 兩個郵件列表。比如 Emacs,找到 Emacs-devel 和 bug-gnu-emacs 郵件列表並訂閱,前者用於討論改進、提新的 feature 等,後者用於反饋 bug、提交 patch。
郵件列表的郵件量一般都比較大,尤其是加入了多個專案的郵件列表後,不僅資訊多,還很雜亂,所以建議:
1、 建立資料夾,如圖,QQ 郵箱:
2、 做收信規則,根據收件人規則把郵件移動到相應的資料夾中。如圖,QQ 郵箱:
2、修改程式碼
GNU 專案有自己的程式碼倉庫,在這裡:https://savannah.gnu.org/ 。
找到 Emacs 的 Git 倉庫:http://git.savannah.gnu.org/cgit/emacs.git
然後把程式碼拉回本地:
$ git clone git://git.sv.gnu.org/emacs.git -b emacs-25
Emacs 有很多分支,目前的開發主要在 emacs-25 這個分支上進行,所以上面命令我是從 emacs-25 分支上拉取的程式碼。
一段時間後維護者會把程式碼合併到 master 分支中。
如果之前已經拉過程式碼了,在修改前記得 pull 一次來保持程式碼是最新的:
$ git pull
不要在當前分支上修改程式碼,理由有很多,比如官方不一定接受你的 patch。而是對每修一個 bug 都新建一個分支:
$ git checkout -b tramp-sh-add-doas --track emacs-25
這行命令我新建了一個叫“tramp-sh-add-doas”的分支,取名要有含義,尤其是你在要修復多個 bug 時好區分。這個名字的含義是為了在 tramp-sh 裡增加 doas 命令的支援。
接下來是漫長的編碼階段,主要注意兩點:
- 編碼風格統一,最簡單的方法就是看看同檔案裡別人是怎麼寫的,他的縮排、命名、花括號位置等等。
- 不要去修改無關的程式碼,比如去動了其他位置的縮排等等。不然維護者會很疑惑。
程式碼寫完後,commit 一下:
$ git commit -a
寫一段好的 commit 也很重要,最簡單的方法就是執行 git log,看別人怎麼寫的。一般 commit 的第一行寫清楚你本次修改是做了什麼,再空一行,逐行列出增加、修改的函式和變數等,讓開發者一目瞭然,比如:
Author: Xi Lu <lx@shellcodes.org> Date: Fri Dec 11 10:52:08 2015 +0200 Initial support for Ruby in 'etags' * lib-src/etags.c <Ruby_suffixes>: New variable. (lang_names): Add an entry for Ruby. (Ruby_functions): New function. (Bug#22116)
提交 commit 後,執行以下命令生成一個 patch 檔案:
$ git format-patch emacs-25
這行命令會把當前分支修改的內容和 emacs-25 分支做 diff,然後在當前目錄下生成一個 diff 檔案,如:0001-Add-support-for-doas-command.patch。
生成的 patch 檔案是需要發到郵件列表裡,相關檔案的維護者會跟你溝通併合併到程式碼倉庫中的,和 Github 上直接發 Pull Request 來比,就沒那麼幸福了。
最後,把補丁傳送到郵件列表去(這裡或許你需要配置一下 Git 的傳送郵件,請自行找資料):
git send-email --to=bug-gnu-emacs@gnu.org 補丁檔案1 補丁檔案2 補丁檔案..
之後 GNU 的 bug 跟蹤系統會確認你的 bug,並給你提交的 bug 分配一個 ID,然後自動回覆一封郵件給你:
然後就等待相關維護者回復郵件與你溝通。在和開發者溝通時就事論事,不要說無關的廢話。另外一定要注意回覆郵件的風格,社群一般使用的 Bottom-posting(下回復)風格,實際上很多開源軟體都是用的 Bottom-posting 風格的。如果這方面你不熟悉,請參考維基百科學習一下: https://zh.wikipedia.org/wiki/%E5%9B%9E%E5%B8%96%E9%A3%8E%E6%A0%BC 。QQ 郵箱網頁版是不支援下回復的,最好用郵件客戶端來回復,一般郵件客戶端是可以設定成 Bottom-posting 風格的,請 Google 自行查閱設定方法。
開發者和你進一步溝通,完畢之後會關閉這個 bug,並把程式碼合併到倉庫中去。
你的程式碼在合併到倉庫之前可能還會有一道障礙,直到清除障礙後程式碼才可以進入倉庫——籤協議。
3、簽署協議檔案
如果你貢獻的程式碼超過15行(見:https://www.gnu.org/prep/maintain/html_node/Legally-Significant.html),是需要和 FSF(自由軟體基金會)籤紙質協議的。
籤協議的主要目的是證明程式碼由你所寫,沒有侵犯到其他版權,並且版權歸給 FSF。
如果你提交的程式碼確實需要籤檔案,開發者會郵件回你一個申請表模板,讓你按模板內容填寫一封申請郵件給 FSF 來申請籤協議檔案的。
模板內容如下(注:“#”是我自行新增的註解):
---------------------------------------------------------------------- REQUEST: SEND FORM FOR PAST AND FUTURE CHANGES [What is the name of the program or package you're contributing to?] # 你貢獻的專案名稱,比如Emacs。 # 注意一個專案只能籤一份協議,如果你這裡寫多個專案,就需要籤多份協議。 [Did you copy any files or text written by someone else in these changes? Even if that material is free software, we need to know about it.] # 解釋你貢獻的程式碼裡是否用了其他專案程式碼,如果有就列一下。 [Do you have an employer who might have a basis to claim to own your changes? Do you attend a school which might make such a claim?] # 是不是以你個人名義來提交程式碼的,是的話就寫no。 # 如果是公司名義,好像需要公司和FSF再籤協議,這個流程我不熟悉。 [For the copyright registration, what country are you a citizen of?] # 一般就寫China。 [What year were you born?] # 你生日。 [Please write your email address here.] # 你郵件地址。 [Please write your postal address here.] # 通訊地址,需要寫詳細點。 [Which files have you changed so far, and which new files have you written so far?] # 你改變了哪些檔案,列出來。
把這封郵件發給 copyright-clerk@fsf.org, 郵件標題是你真實的姓名 ,郵件內容就是上面模板填寫後的內容。
然後 FSF 會稽核你的申請,一般需要幾天。稽核通過後他們會給你發一封郵件,讓你將附件的 PDF 檔案列印下來,然後簽字,簽上你的名字(不要用中文),以及寫好日期(日期的月份需要用英文,不要用數字,如:2015 December 30)。
接下來,把簽完的紙質協議寄到美國去。你可以去淘寶找 DHL 快遞代收,DHL 大概3天就到了,費用大概是¥140~¥160之間。
他們收到你的紙質協議後也會簽字,需要等幾天,具體週期視他們處理情況而定,如果你等了兩週都還沒回你,那麼你可以回郵件問問怎麼回事,比如我的就正好遇到聖誕節放假。
最後,他們會把簽字後的掃描件以 PDF 格式傳送到你的郵箱,整個過程算是結束了。
如果你換了工作,也請告知他們,有可能會涉及到協議重籤,比如你到了新公司,給他們提交的程式碼不再是個人性質。
Happy Hacking。
4、感謝
Xue Fuqiao、Eli Zaretskii
相關文章
- 如何給 swoft 貢獻程式碼
- 如何給開源專案做貢獻
- NSA 向 Coreboot 專案貢獻程式碼boot
- 我給Apache頂級專案貢獻了點原始碼。Apache原始碼
- 如何為PHP貢獻程式碼PHP
- 如何為 PHP 貢獻程式碼PHP
- 【開源社】您會為開源專案貢獻程式碼嗎?
- 舒服,給Spring貢獻一波原始碼。Spring原始碼
- CNCF:中國已成為全球第二大開源貢獻國 CNCF專案的程式碼貢獻接近100萬
- 第一次向開源專案貢獻程式碼的歷程
- 以Dubbo為例,聊聊如何為開源專案做貢獻
- 專案總結以及團隊貢獻分
- 如何向開源專案做貢獻(以 incubator-dubbo 為例)BAT
- 貢獻Dubbo生態,阿里開源Nacos專案阿里
- Measure階段是如何為六西格瑪專案做貢獻的?
- [譯] 為 GitHub 專案做出貢獻的初學者指南Github
- 學習如何向Linux核心貢獻程式碼,接受Eudyptula挑戰Linux
- 貢獻給工作狂的chrome外掛Chrome
- 「2021」我給Vue.js生態貢獻程式碼的這一年Vue.js
- 成為七牛雲 Contributor -如何貢獻 logkit 程式碼
- 聊聊原始碼貢獻這件大事原始碼
- 蘋果的貢獻蘋果
- 如何為開源軟體做出貢獻
- 如何向 Mozilla 開源社群做貢獻
- 淺談團隊貢獻分如何分配
- HttpClient.PatchAsJsonAsync - dotnet/runtime 專案貢獻小記HTTPclientJSON
- 5 個提升你開源專案貢獻者基數的方法
- 向 Node.js 核心貢獻程式碼的六個步驟Node.js
- 甲骨文貢獻Linux程式程式碼 擴大Novell硬體支援Linux
- 貢獻開源專案沒那麼簡單,你要負責到底
- 如何幫助OpenStack開發者成為貢獻者
- 談談我第一次如何為 Laravel 貢獻原始碼Laravel原始碼
- 今晚戰碼先鋒潤和賽道第2期直播丨如何參與OpenHarmony程式碼貢獻
- 使用ExtJS之Grid有感而發,貢獻示例給大家JS
- 貢獻過Github開源專案的可領$231,親測有效!Github
- 如何向開源軟體貢獻自己的力量
- 團隊貢獻分分配
- 如何統計專案程式碼?