昨晚終於向內核上游提交了人生中第一個 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
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 ,-v 參數會在你的 Commit 信息下方顯示出你做的修改,確保你能再三檢查自己的改動,這一個參數不是必須的,但是推薦這么做。
注意,Commit 信息的格式有嚴格限制,我就不廢話了,直接上模板。
mm: fix some errors
Why I do these changes and how I do it.
Signed-off-by: My Name
第一部分是 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-errors.patch
檢查你的 Patch 格式
運行以下命令檢查你的 Patch 格式有沒有問題,要做到 0 errors, 0 warnings。
./scripts/checkpatch.pl 0001-mm-fix-some-errors.patch
發送 Patch
既然 Patch 已經生成完畢,那么是時候發送給上游維護者了。
找出應該發給誰
運行以下命令找出你應該把 Patch 發給誰。
./scripts/get_maintainer.pl -f include/linux/gfp.h
注意,include/linux/gfp.h 這個文件名改成你所修改的文件。
在我這里,該命令輸出如下:
Andrew Morton (commit_signer:7/8=88%)
Michal Hocko (commit_signer:3/8=38%,authored:1/8=12%,added_lines:3/21=14%,removed_lines:10/33=30%)
Vlastimil Babka (commit_signer:3/8=38%,authored:1/8=12%,added_lines:8/21=38%,removed_lines:6/33=18%)
Alexander Duyck (commit_signer:3/8=38%,authored:3/8=38%,added_lines:6/21=29%,removed_lines:5/33=15%)
Mel Gorman (commit_signer:2/8=25%)
Vladimir Davydov (authored:1/8=12%,removed_lines:9/33=27%)
My Name (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-errors.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-errors.patch
之后你的 Patch 就發送給上游維護者並抄送到對應的郵件列表了。
后續
靜靜的等待維護者的郵件通知吧,如果 Patch 並入上游分支的話會給你發郵件通知的,如果被打回的話也會告訴你哪里錯了。等我以后提交個復雜點的補丁被打回之后再來寫這部分。