首頁 > 軟體

如何向 Linux Kernel 提交 Patch

2020-06-16 17:17:50

昨晚終於向核心上游提交了人生中第一個 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 來完成。

  1. 開啟 Git 組態檔

    vim ~/.gitconfig

  2. 檔案末尾追加如下內容

    [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>
  1. 第一部分是 short description,以子系統名打頭,比如 mm,注意分號後面加個空格,不知道子系統名的可以看看你修改的這個檔案的修改歷史,看看之前的開發者是怎麼寫的。這一部分需要使用一句簡短的話描述你所做的修改,要讓維護者一眼就看出這個 Patch 大概乾了什麼事。

  2. 第二部分是 the body of your patch,這一部分要詳細的解釋你為何要做這個修改,以及怎麼做的,注意時態用現在時,語態用主動形式。

  3. 第三部分是之前的 -s 引數自動加上的,不用管。

  4. 必須要注意的是,這三部分之間都要有一個空行隔開。

如果 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


IT145.com E-mail:sddin#qq.com