2021-05-12 14:32:11
如何向 Linux Kernel 提交 Patch
昨晚終於向核心上游提交了人生中第一個 Patch,今天早上起床迫不及待的看手機,發現維護者 Andrew Morton 在6點31分回復我了:The patch has been added to the -mm tree.
頓時感到異常興奮。雖然這個 Patch 沒什麼技術含量,但是至少這是我在看程式碼過程中自己發現的,終於體會到了進步的感覺。下面我把 Patch 提交的步驟記錄一下,也供別人參考下。
Git Email 設定
為了確保傳送的 Patch 格式不會出錯,我們使用 Git 自身提供的命令 git send-email
。
安裝 git send-email
我用的 Fedora,安裝命令為 sudo dnf install git-email
,其他系統請自行使用 yum
或 apt
。
設定 git-email
使用 Gmail 郵箱服務
我比較喜歡 Gmail,所以此處就讓 git-email
使用 Gmail 提供的郵箱服務了,換句話說 git-email
只是 一個郵件傳送用戶端而已,真正的工作還需要 Gmail 來完成。
-
開啟 Git 組態檔
vim ~/.gitconfig
-
檔案末尾追加如下內容
[sendemail] from = My Name <my_email@gmail.com> smtpserver = smtp.gmail.com smtpuser = my_email@gmail.com smtpencryption = tls smtppass = my_gmail_password chainreplyto = false smtpserverport = 587
修改程式碼樹併生成 Patch
建立一個新的分支
這是為之後生成 Patch 提供方便,使用命令如下:
git branch develop git checkout develop
修改核心程式碼樹
這一步修改什麼就取決於你了。
提交修改
git add . git commit -s -v
注意 git commit
命令會自動開啟編輯器讓你編輯 Commit 資訊,-s
引數可以自動在你的 Commit 資訊下加上一行Signed-off-by: My Name <my_email@gmail.com>
,-v
引數會在你的 Commit 資訊下方顯示出你做的修改,確保你能再三檢查自己的改動,這一個引數不是必須的,但是推薦這麼做。
注意,Commit 資訊的格式有嚴格限制,我就不廢話了,直接上模板。
mm: fix some error Why I do these changes and how I do it. Signed-off-by: My Name <my_email@gmail.com>
-
第一部分是 short description,以子系統名打頭,比如 mm,注意分號後面加個空格,不知道子系統名的可以看看你修改的這個檔案的修改歷史,看看之前的開發者是怎麼寫的。這一部分需要使用一句簡短的話描述你所做的修改,要讓維護者一眼就看出這個 Patch 大概乾了什麼事。
-
第二部分是 the body of your patch,這一部分要詳細的解釋你為何要做這個修改,以及怎麼做的,注意時態用現在時,語態用主動形式。
-
第三部分是之前的
-s
引數自動加上的,不用管。 -
必須要注意的是,這三部分之間都要有一個空行隔開。
如果 commit
之後還想修改 Commit 資訊的話需要使用命令 git commit --amend -v
。
生成 Patch
既然修改已經提交,那麼是時候生成 Patch 了。
git format-patch master
這條命令是以 master 分支為基準,檢測你在當前 develop 分支所做的修改並生成 Patch 檔案。
命令完成後,你就可以看到你的 Patch 檔案了。
[haolee@haolee linux]$ ls *.patch 0001-mm-fix-some-error.patch
檢查你的 Patch 格式
執行以下命令檢查你的 Patch 格式有沒有問題,要做到 0 errors, 0 warnings
。
./scripts/checkpatch.pl 0001-mm-fix-some-error.patch
傳送 Patch
既然 Patch 已經生成完畢,那麼是時候傳送給上游維護者了。
找出應該發給誰
執行以下命令找出你應該把 Patch 發給誰。
./scripts/get_maintainer.pl -f include/linux/gfp.h
注意,include/linux/gfp.h
這個檔名改成你所修改的檔案。
在我這裡,該命令輸出如下:
Andrew Morton <akpm@linux-foundation.org> (commit_signer:7/8=88%) Michal Hocko <mhocko@SUSE.com> (commit_signer:3/8=38%,authored:1/8=12%,added_lines:3/21=14%,removed_lines:10/33=30%) Vlastimil Babka <vbabka@suse.cz> (commit_signer:3/8=38%,authored:1/8=12%,added_lines:8/21=38%,removed_lines:6/33=18%) Alexander Duyck <alexander.h.duyck@intel.com> (commit_signer:3/8=38%,authored:3/8=38%,added_lines:6/21=29%,removed_lines:5/33=15%) Mel Gorman <mgorman@suse.de> (commit_signer:2/8=25%) Vladimir Davydov <vdavydov.dev@gmail.com> (authored:1/8=12%,removed_lines:9/33=27%) My Name <my_email@gmail.com> (authored:1/8=12%,added_lines:2/21=10%,removed_lines:2/33=6%) linux-mm@kvack.org (open list:MEMORY MANAGEMENT) linux-kernel@vger.kernel.org (open list)
測試傳送
對於像我這樣的新手來說,最好在傳送給上游維護者之前先拿自己郵箱做個測試,小心點總沒壞處。
git send-email --to my_qq@qq.com 0001-mm-fix-some-error.patch
一切正常的話,你應該可以收到郵件了,檢查下格式什麼的是否和你預想的一樣。
正式傳送
git send-email --to akpm@linux-foundation.org --cc alexander.h.duyck@intel.com --cc mhocko@suse.com --cc vbabka@suse.cz --cc mgorman@suse.de --cc l.stach@pengutronix.de --cc vdavydov.dev@gmail.com --cc linux-mm@kvack.org --cc linux-kernel@vger.kernel.org --cc my_email@gmail.com 0001-mm-fix-some-error.patch
之後你的 Patch 就傳送給上游維護者並抄送到對應的郵寄清單了。
後續
靜靜的等待維護者的郵件通知吧,如果 Patch 併入上游分支的話會給你發郵件通知的,如果被打回的話也會告訴你哪裡錯了。等我以後提交個複雜點的修補程式被打回之後再來寫這部分。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-04/142492.htm
相關文章