1390f915aSHu Haowen.. SPDX-License-Identifier: GPL-2.0 2390f915aSHu Haowen 3390f915aSHu Haowen.. include:: ../disclaimer-zh_TW.rst 4390f915aSHu Haowen 5390f915aSHu Haowen:Original: :ref:`Documentation/process/7.AdvancedTopics.rst <development_advancedtopics>` 6390f915aSHu Haowen 7390f915aSHu Haowen:Translator: 8390f915aSHu Haowen 9390f915aSHu Haowen 時奎亮 Alex Shi <alex.shi@linux.alibaba.com> 10390f915aSHu Haowen 11390f915aSHu Haowen:校譯: 12390f915aSHu Haowen 13390f915aSHu Haowen 吳想成 Wu XiangCheng <bobwxc@email.cn> 14*44a54e25SHu Haowen 胡皓文 Hu Haowen <src.res.211@gmail.com> 15390f915aSHu Haowen 16390f915aSHu Haowen.. _tw_development_advancedtopics: 17390f915aSHu Haowen 18390f915aSHu Haowen高級主題 19390f915aSHu Haowen======== 20390f915aSHu Haowen 21390f915aSHu Haowen現在,希望您能夠掌握開發流程的工作方式。然而,還有更多的東西要學!本節將介紹 22390f915aSHu Haowen一些主題,這些主題對希望成爲Linux內核開發過程常規部分的開發人員有幫助。 23390f915aSHu Haowen 24390f915aSHu Haowen使用Git管理補丁 25390f915aSHu Haowen--------------- 26390f915aSHu Haowen 27390f915aSHu Haowen內核使用分布式版本控制始於2002年初,當時Linus首次開始使用專有的Bitkeeper應用 28390f915aSHu Haowen程序。雖然BitKeeper存在爭議,但它所體現的軟體版本管理方法卻肯定不是。分布式 29390f915aSHu Haowen版本控制可以立即加速內核開發項目。現在有好幾種免費的BitKeeper替代品。 30390f915aSHu Haowen但無論好壞,內核項目都已經選擇了Git作爲其工具。 31390f915aSHu Haowen 32390f915aSHu Haowen使用Git管理補丁可以使開發人員的生活更加輕鬆,尤其是隨著補丁數量的增長。Git也 33390f915aSHu Haowen有其粗糙的邊角和一定的危險性,它是一個年輕和強大的工具,仍然在其開發人員完善 34390f915aSHu Haowen中。本文檔不會試圖教會讀者如何使用git;這會是個巨長的文檔。相反,這裡的重點 35390f915aSHu Haowen將是Git如何特別適合內核開發過程。想要加快用Git速度的開發人員可以在以下網站上 36390f915aSHu Haowen找到更多信息: 37390f915aSHu Haowen 38390f915aSHu Haowen https://git-scm.com/ 39390f915aSHu Haowen 40390f915aSHu Haowen https://www.kernel.org/pub/software/scm/git/docs/user-manual.html 41390f915aSHu Haowen 42390f915aSHu Haowen同時網上也能找到各種各樣的教程。 43390f915aSHu Haowen 44390f915aSHu Haowen在嘗試使用它生成補丁供他人使用之前,第一要務是閱讀上述網頁,對Git的工作方式 45390f915aSHu Haowen有一個紮實的了解。使用Git的開發人員應能進行拉取主線存儲庫的副本,查詢修訂 46390f915aSHu Haowen歷史,提交對樹的更改,使用分支等操作。了解Git用於重寫歷史的工具(如rebase) 47390f915aSHu Haowen也很有用。Git有自己的術語和概念;Git的新用戶應該了解引用、遠程分支、索引、 48390f915aSHu Haowen快進合併、推拉、游離頭等。一開始可能有點嚇人,但這些概念不難通過一點學習來 49390f915aSHu Haowen理解。 50390f915aSHu Haowen 51390f915aSHu Haowen使用git生成通過電子郵件提交的補丁是提高速度的一個很好的練習。 52390f915aSHu Haowen 53390f915aSHu Haowen當您準備好開始建立Git樹供其他人查看時,無疑需要一個可以從中拉取的伺服器。 54390f915aSHu Haowen如果您有一個可以訪問網際網路的系統,那麼使用git-daemon設置這樣的伺服器相對 55390f915aSHu Haowen簡單。同時,免費的公共託管網站(例如github)也開始出現在網絡上。成熟的開發 56390f915aSHu Haowen人員可以在kernel.org上獲得一個帳戶,但這些帳戶並不容易得到;更多有關信息, 57390f915aSHu Haowen請參閱 https://kernel.org/faq/ 。 58390f915aSHu Haowen 59390f915aSHu Haowen正常的Git工作流程涉及到許多分支的使用。每一條開發線都可以分爲單獨的「主題 60390f915aSHu Haowen分支」,並獨立維護。Git的分支很容易使用,沒有理由不使用它們。而且,在任何 61390f915aSHu Haowen情況下,您都不應該在任何您打算讓其他人從中拉取的分支中進行開發。應該小心地 62390f915aSHu Haowen創建公開可用的分支;當開發分支處於完整狀態並已準備好時(而不是之前)才合併 63390f915aSHu Haowen開發分支的補丁。 64390f915aSHu Haowen 65390f915aSHu HaowenGit提供了一些強大的工具,可以讓您重寫開發歷史。一個不方便的補丁(比如說, 66390f915aSHu Haowen一個打破二分法的補丁,或者有其他一些明顯的缺陷)可以在適當的位置修復,或者 67390f915aSHu Haowen完全從歷史中消失。一個補丁系列可以被重寫,就好像它是在今天的主線上寫的一樣, 68390f915aSHu Haowen即使你已經花了幾個月的時間在寫它。可以透明地將更改從一個分支轉移到另一個 69390f915aSHu Haowen分支。等等。明智地使用git修改歷史的能力可以幫助創建問題更少的乾淨補丁集。 70390f915aSHu Haowen 71390f915aSHu Haowen然而,過度使用這種功能可能會導致其他問題,而不僅僅是對創建完美項目歷史的 72390f915aSHu Haowen簡單癡迷。重寫歷史將重寫該歷史中包含的更改,將經過測試(希望如此)的內核樹 73390f915aSHu Haowen變爲未經測試的內核樹。除此之外,如果開發人員沒有共享項目歷史,他們就無法 74390f915aSHu Haowen輕鬆地協作;如果您重寫了其他開發人員拉入他們存儲庫的歷史,您將使這些開發 75390f915aSHu Haowen人員的生活更加困難。因此,這裡有一個簡單的經驗法則:被導出到其他地方的歷史 76390f915aSHu Haowen在此後通常被認爲是不可變的。 77390f915aSHu Haowen 78390f915aSHu Haowen因此,一旦將一組更改推送到公開可用的伺服器上,就不應該重寫這些更改。如果您 79390f915aSHu Haowen嘗試強制進行無法快進合併的更改(即不共享同一歷史記錄的更改),Git將嘗試強制 80390f915aSHu Haowen執行此規則。這可能覆蓋檢查,有時甚至需要重寫導出的樹。在樹之間移動變更集以 81390f915aSHu Haowen避免linux-next中的衝突就是一個例子。但這種行爲應該是罕見的。這就是爲什麼 82390f915aSHu Haowen開發應該在私有分支中進行(必要時可以重寫)並且只有在公共分支處於合理的較新 83390f915aSHu Haowen狀態時才轉移到公共分支中的原因之一。 84390f915aSHu Haowen 85390f915aSHu Haowen當主線(或其他一組變更所基於的樹)前進時,很容易與該樹合併以保持領先地位。 86390f915aSHu Haowen對於一個私有的分支,rebasing 可能是一個很容易跟上另一棵樹的方法,但是一旦 87390f915aSHu Haowen一棵樹被導出到外界,rebasing就不可取了。一旦發生這種情況,就必須進行完全 88390f915aSHu Haowen合併(merge)。合併有時是很有意義的,但是過於頻繁的合併會不必要地擾亂歷史。 89390f915aSHu Haowen在這種情況下建議的做法是不要頻繁合併,通常只在特定的發布點(如主線-rc發布) 90390f915aSHu Haowen合併。如果您對特定的更改感到緊張,則可以始終在私有分支中執行測試合併。在 91390f915aSHu Haowen這種情況下,git「rerere」工具很有用;它能記住合併衝突是如何解決的,這樣您 92390f915aSHu Haowen就不必重複相同的工作。 93390f915aSHu Haowen 94390f915aSHu Haowen關於Git這樣的工具的一個最大的反覆抱怨是:補丁從一個存儲庫到另一個存儲庫的 95390f915aSHu Haowen大量移動使得很容易陷入錯誤建議的變更中,這些變更避開審查雷達進入主線。當內 96390f915aSHu Haowen核開發人員看到這種情況發生時,他們往往會感到不高興;在Git樹上放置未審閱或 97390f915aSHu Haowen主題外的補丁可能會影響您將來讓樹被拉取的能力。引用Linus的話: 98390f915aSHu Haowen 99390f915aSHu Haowen:: 100390f915aSHu Haowen 101390f915aSHu Haowen 你可以給我發補丁,但當我從你那裡拉取一個Git補丁時,我需要知道你清楚 102390f915aSHu Haowen 自己在做什麼,我需要能夠相信事情而 *無需* 手動檢查每個單獨的更改。 103390f915aSHu Haowen 104c398488dSXueshi Hu(http://lwn.net/Articles/224135/)。 105390f915aSHu Haowen 106390f915aSHu Haowen爲了避免這種情況,請確保給定分支中的所有補丁都與相關主題緊密相關;「驅動程序 107390f915aSHu Haowen修復」分支不應更改核心內存管理代碼。而且,最重要的是,不要使用Git樹來繞過 108390f915aSHu Haowen審查過程。不時的將樹的摘要發布到相關的列表中,在合適時候請求linux-next中 109390f915aSHu Haowen包含該樹。 110390f915aSHu Haowen 111390f915aSHu Haowen如果其他人開始發送補丁以包含到您的樹中,不要忘記審閱它們。還要確保您維護正確 112390f915aSHu Haowen的作者信息; git 「am」工具在這方面做得最好,但是如果補丁通過第三方轉發給您, 113390f915aSHu Haowen您可能需要在補丁中添加「From:」行。 114390f915aSHu Haowen 115390f915aSHu Haowen請求拉取時,請務必提供所有相關信息:樹的位置、要拉取的分支以及拉取將導致的 116390f915aSHu Haowen更改。在這方面 git request-pull 命令非常有用;它將按照其他開發人員所期望的 117390f915aSHu Haowen格式化請求,並檢查以確保您已記得將這些更改推送到公共伺服器。 118390f915aSHu Haowen 119390f915aSHu Haowen審閱補丁 120390f915aSHu Haowen-------- 121390f915aSHu Haowen 122390f915aSHu Haowen一些讀者顯然會反對將本節與「高級主題」放在一起,因爲即使是剛開始的內核開發人員 123390f915aSHu Haowen也應該審閱補丁。當然,沒有比查看其他人發布的代碼更好的方法來學習如何在內核環境 124390f915aSHu Haowen中編程了。此外,審閱者永遠供不應求;通過審閱代碼,您可以對整個流程做出重大貢獻。 125390f915aSHu Haowen 126390f915aSHu Haowen審查代碼可能是一副令人生畏的圖景,特別是對一個新的內核開發人員來說,他們 127390f915aSHu Haowen可能會對公開詢問代碼感到緊張,而這些代碼是由那些有更多經驗的人發布的。不過, 128390f915aSHu Haowen即使是最有經驗的開發人員編寫的代碼也可以得到改進。也許對(所有)審閱者最好 129390f915aSHu Haowen的建議是:把審閱評論當成問題而不是批評。詢問「在這條路徑中如何釋放鎖?」 130390f915aSHu Haowen總是比說「這裡的鎖是錯誤的」更好。 131390f915aSHu Haowen 132390f915aSHu Haowen不同的開發人員將從不同的角度審查代碼。部分人會主要關注代碼風格以及代碼行是 133390f915aSHu Haowen否有尾隨空格。其他人會主要關注補丁作爲一個整體實現的變更是否對內核有好處。 134390f915aSHu Haowen同時也有人會檢查是否存在鎖問題、堆棧使用過度、可能的安全問題、在其他地方 135390f915aSHu Haowen發現的代碼重複、足夠的文檔、對性能的不利影響、用戶空間ABI更改等。所有類型 136390f915aSHu Haowen的檢查,只要它們能引導更好的代碼進入內核,都是受歡迎和值得的。 137390f915aSHu Haowen 138