.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_TW.rst :Original: :ref:`Documentation/process/7.AdvancedTopics.rst <development_advancedtopics>` :Translator: 時奎亮 Alex Shi <alex.shi@linux.alibaba.com> :æ ¡è¯: å³æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> 胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn> .. _tw_development_advancedtopics: 高級主題 ======== ç¾åœ¨ï¼Œå¸Œæœ›æ‚¨èƒ½å¤ 掌æ¡é–‹ç™¼æµç¨‹çš„工作方å¼ã€‚然而,還有更多的æ±è¥¿è¦å¸ï¼æœ¬ç¯€å°‡ä»‹ç´¹ 一些主題,這些主題å°å¸Œæœ›æˆçˆ²Linuxå…§æ ¸é–‹ç™¼éŽç¨‹å¸¸è¦éƒ¨åˆ†çš„開發人員有幫助。 使用Git管ç†è£œä¸ --------------- å…§æ ¸ä½¿ç”¨åˆ†ä½ˆå¼ç‰ˆæœ¬æŽ§åˆ¶å§‹æ–¼2002å¹´åˆï¼Œç•¶æ™‚Linus首次開始使用專有的Bitkeeper應用 程åºã€‚雖然BitKeeperå˜åœ¨çˆè°ï¼Œä½†å®ƒæ‰€é«”ç¾çš„軟件版本管ç†æ–¹æ³•å»è‚¯å®šä¸æ˜¯ã€‚åˆ†ä½ˆå¼ ç‰ˆæœ¬æŽ§åˆ¶å¯ä»¥ç«‹å³åŠ é€Ÿå…§æ ¸é–‹ç™¼é …ç›®ã€‚ç¾åœ¨æœ‰å¥½å¹¾ç¨®å…費的BitKeeper替代å“。 ä½†ç„¡è«–å¥½å£žï¼Œå…§æ ¸é …ç›®éƒ½å·²ç¶“é¸æ“‡äº†Git作爲其工具。 使用Git管ç†è£œä¸å¯ä»¥ä½¿é–‹ç™¼äººå“¡çš„ç”Ÿæ´»æ›´åŠ è¼•é¬†ï¼Œå°¤å…¶æ˜¯éš¨ç€è£œä¸æ•¸é‡çš„增長。Git也 有其粗糙的邊角和一定的å±éšªæ€§ï¼Œå®ƒæ˜¯ä¸€å€‹å¹´è¼•å’Œå¼·å¤§çš„工具,ä»ç„¶åœ¨å…¶é–‹ç™¼äººå“¡å®Œå–„ ä¸ã€‚本文檔ä¸æœƒè©¦åœ–教會讀者如何使用git;這會是個巨長的文檔。相å,這è£çš„é‡é»ž 將是Git如何特別é©åˆå…§æ ¸é–‹ç™¼éŽç¨‹ã€‚想è¦åŠ 快用Git速度的開發人員å¯ä»¥åœ¨ä»¥ä¸‹ç¶²ç«™ä¸Š 找到更多信æ¯ï¼š https://git-scm.com/ https://www.kernel.org/pub/software/scm/git/docs/user-manual.html åŒæ™‚網上也能找到å„種å„樣的教程。 在嘗試使用它生æˆè£œä¸ä¾›ä»–人使用之å‰ï¼Œç¬¬ä¸€è¦å‹™æ˜¯é–±è®€ä¸Šè¿°ç¶²é ,å°Gitçš„å·¥ä½œæ–¹å¼ æœ‰ä¸€å€‹ç´®å¯¦çš„çžè§£ã€‚使用Git的開發人員應能進行拉å–主線å˜å„²åº«çš„副本,查詢修訂 æ·å²ï¼Œæ交å°æ¨¹çš„更改,使用分支ç‰æ“作。çžè§£Git用於é‡å¯«æ·å²çš„工具(如rebase) 也很有用。Git有自己的術語和概念;Git的新用戶應該çžè§£å¼•ç”¨ã€é 程分支ã€ç´¢å¼•ã€ 快進åˆä½µã€æŽ¨æ‹‰ã€éŠé›¢é ç‰ã€‚一開始å¯èƒ½æœ‰é»žåš‡äººï¼Œä½†é€™äº›æ¦‚念ä¸é›£é€šéŽä¸€é»žå¸ç¿’來 ç†è§£ã€‚ 使用git生æˆé€šéŽé›»å郵件æ交的補ä¸æ˜¯æ高速度的一個很好的練習。 當您準備好開始建立Git樹供其他人查看時,無疑需è¦ä¸€å€‹å¯ä»¥å¾žä¸æ‹‰å–çš„æœå‹™å™¨ã€‚ 如果您有一個å¯ä»¥è¨ªå•å› 特網的系統,那麼使用git-daemonè¨ç½®é€™æ¨£çš„æœå‹™å™¨ç›¸å° 簡單。åŒæ™‚,å…費的公共託管網站(例如github)也開始出ç¾åœ¨ç¶²çµ¡ä¸Šã€‚æˆç†Ÿçš„開發 人員å¯ä»¥åœ¨kernel.org上ç²å¾—一個帳戶,但這些帳戶並ä¸å®¹æ˜“得到;更多有關信æ¯ï¼Œ è«‹åƒé–± https://kernel.org/faq/ 。 æ£å¸¸çš„Git工作æµç¨‹æ¶‰åŠåˆ°è¨±å¤šåˆ†æ”¯çš„使用。æ¯ä¸€æ¢é–‹ç™¼ç·šéƒ½å¯ä»¥åˆ†çˆ²å–®ç¨çš„“主題 分支â€ï¼Œä¸¦ç¨ç«‹ç¶è·ã€‚Git的分支很容易使用,沒有ç†ç”±ä¸ä½¿ç”¨å®ƒå€‘。而且,在任何 情æ³ä¸‹ï¼Œæ‚¨éƒ½ä¸æ‡‰è©²åœ¨ä»»ä½•æ‚¨æ‰“算讓其他人從ä¸æ‹‰å–的分支ä¸é€²è¡Œé–‹ç™¼ã€‚應該å°å¿ƒåœ° 創建公開å¯ç”¨çš„分支;當開發分支處於完整狀態並已準備好時(而ä¸æ˜¯ä¹‹å‰ï¼‰æ‰åˆä½µ 開發分支的補ä¸ã€‚ Gitæ供了一些強大的工具,å¯ä»¥è®“您é‡å¯«é–‹ç™¼æ·å²ã€‚一個ä¸æ–¹ä¾¿çš„補ä¸ï¼ˆæ¯”如說, ä¸€å€‹æ‰“ç ´äºŒåˆ†æ³•çš„è£œä¸ï¼Œæˆ–者有其他一些明顯的缺陷)å¯ä»¥åœ¨é©ç•¶çš„ä½ç½®ä¿®å¾©ï¼Œæˆ–者 完全從æ·å²ä¸æ¶ˆå¤±ã€‚一個補ä¸ç³»åˆ—å¯ä»¥è¢«é‡å¯«ï¼Œå°±å¥½åƒå®ƒæ˜¯åœ¨ä»Šå¤©çš„主線上寫的一樣, å³ä½¿ä½ 已經花了幾個月的時間在寫它。å¯ä»¥é€æ˜Žåœ°å°‡æ›´æ”¹å¾žä¸€å€‹åˆ†æ”¯è½‰ç§»åˆ°å¦ä¸€å€‹ 分支。ç‰ç‰ã€‚明智地使用git修改æ·å²çš„能力å¯ä»¥å¹«åŠ©å‰µå»ºå•é¡Œæ›´å°‘的乾淨補ä¸é›†ã€‚ 然而,éŽåº¦ä½¿ç”¨é€™ç¨®åŠŸèƒ½å¯èƒ½æœƒå°Žè‡´å…¶ä»–å•é¡Œï¼Œè€Œä¸åƒ…僅是å°å‰µå»ºå®Œç¾Žé …ç›®æ·å²çš„ 簡單癡迷。é‡å¯«æ·å²å°‡é‡å¯«è©²æ·å²ä¸åŒ…å«çš„更改,將經éŽæ¸¬è©¦ï¼ˆå¸Œæœ›å¦‚æ¤ï¼‰çš„å…§æ ¸æ¨¹ è®Šçˆ²æœªç¶“æ¸¬è©¦çš„å…§æ ¸æ¨¹ã€‚é™¤æ¤ä¹‹å¤–ï¼Œå¦‚æžœé–‹ç™¼äººå“¡æ²’æœ‰å…±äº«é …ç›®æ·å²ï¼Œä»–們就無法 輕鬆地å”作;如果您é‡å¯«äº†å…¶ä»–開發人員拉入他們å˜å„²åº«çš„æ·å²ï¼Œæ‚¨å°‡ä½¿é€™äº›é–‹ç™¼ äººå“¡çš„ç”Ÿæ´»æ›´åŠ å›°é›£ã€‚å› æ¤ï¼Œé€™è£æœ‰ä¸€å€‹ç°¡å–®çš„經驗法則:被導出到其他地方的æ·å² 在æ¤å¾Œé€šå¸¸è¢«èªçˆ²æ˜¯ä¸å¯è®Šçš„。 å› æ¤ï¼Œä¸€æ—¦å°‡ä¸€çµ„更改推é€åˆ°å…¬é–‹å¯ç”¨çš„æœå‹™å™¨ä¸Šï¼Œå°±ä¸æ‡‰è©²é‡å¯«é€™äº›æ›´æ”¹ã€‚如果您 嘗試強制進行無法快進åˆä½µçš„更改(å³ä¸å…±äº«åŒä¸€æ·å²è¨˜éŒ„的更改),Git將嘗試強制 執行æ¤è¦å‰‡ã€‚這å¯èƒ½è¦†è“‹æª¢æŸ¥ï¼Œæœ‰æ™‚甚至需è¦é‡å¯«å°Žå‡ºçš„樹。在樹之間移動變更集以 é¿å…linux-nextä¸çš„è¡çªå°±æ˜¯ä¸€å€‹ä¾‹å。但這種行爲應該是罕見的。這就是爲什麼 開發應該在ç§æœ‰åˆ†æ”¯ä¸é€²è¡Œï¼ˆå¿…è¦æ™‚å¯ä»¥é‡å¯«ï¼‰ä¸¦ä¸”åªæœ‰åœ¨å…¬å…±åˆ†æ”¯è™•æ–¼åˆç†çš„較新 狀態時æ‰è½‰ç§»åˆ°å…¬å…±åˆ†æ”¯ä¸çš„åŽŸå› ä¹‹ä¸€ã€‚ 當主線(或其他一組變更所基於的樹)å‰é€²æ™‚,很容易與該樹åˆä½µä»¥ä¿æŒé ˜å…ˆåœ°ä½ã€‚ å°æ–¼ä¸€å€‹ç§æœ‰çš„分支,rebasing å¯èƒ½æ˜¯ä¸€å€‹å¾ˆå®¹æ˜“跟上å¦ä¸€æ£µæ¨¹çš„方法,但是一旦 一棵樹被導出到外界,rebasingå°±ä¸å¯å–了。一旦發生這種情æ³ï¼Œå°±å¿…é ˆé€²è¡Œå®Œå…¨ åˆä½µï¼ˆmerge)。åˆä½µæœ‰æ™‚是很有æ„義的,但是éŽæ–¼é »ç¹çš„åˆä½µæœƒä¸å¿…è¦åœ°æ“¾äº‚æ·å²ã€‚ 在這種情æ³ä¸‹å»ºè°çš„åšæ³•æ˜¯ä¸è¦é »ç¹åˆä½µï¼Œé€šå¸¸åªåœ¨ç‰¹å®šçš„發佈點(如主線-rc發佈) åˆä½µã€‚如果您å°ç‰¹å®šçš„更改感到緊張,則å¯ä»¥å§‹çµ‚在ç§æœ‰åˆ†æ”¯ä¸åŸ·è¡Œæ¸¬è©¦åˆä½µã€‚在 這種情æ³ä¸‹ï¼Œgit“rerereâ€å·¥å…·å¾ˆæœ‰ç”¨ï¼›å®ƒèƒ½è¨˜ä½åˆä½µè¡çªæ˜¯å¦‚何解決的,這樣您 å°±ä¸å¿…é‡è¤‡ç›¸åŒçš„工作。 關於Git這樣的工具的一個最大的å覆抱怨是:補ä¸å¾žä¸€å€‹å˜å„²åº«åˆ°å¦ä¸€å€‹å˜å„²åº«çš„ 大é‡ç§»å‹•ä½¿å¾—很容易陷入錯誤建è°çš„變更ä¸ï¼Œé€™äº›è®Šæ›´é¿é–‹å¯©æŸ¥é›·é”進入主線。當內 æ ¸é–‹ç™¼äººå“¡çœ‹åˆ°é€™ç¨®æƒ…æ³ç™¼ç”Ÿæ™‚,他們往往會感到ä¸é«˜èˆˆï¼›åœ¨Git樹上放置未審閱或 主題外的補ä¸å¯èƒ½æœƒå½±éŸ¿æ‚¨å°‡ä¾†è®“樹被拉å–的能力。引用Linus的話: :: ä½ å¯ä»¥çµ¦æˆ‘發補ä¸ï¼Œä½†ç•¶æˆ‘å¾žä½ é‚£è£æ‹‰å–一個Git補ä¸æ™‚,我需è¦çŸ¥é“ä½ æ¸…æ¥š 自己在åšä»€éº¼ï¼Œæˆ‘需è¦èƒ½å¤ 相信事情而 *無需* 手動檢查æ¯å€‹å–®ç¨çš„更改。 (http://lwn.net/Articles/224135/)。 爲了é¿å…這種情æ³ï¼Œè«‹ç¢ºä¿çµ¦å®šåˆ†æ”¯ä¸çš„所有補ä¸éƒ½èˆ‡ç›¸é—œä¸»é¡Œç·Šå¯†ç›¸é—œï¼›â€œé©…å‹•ç¨‹åº ä¿®å¾©â€åˆ†æ”¯ä¸æ‡‰æ›´æ”¹æ ¸å¿ƒå…§å˜ç®¡ç†ä»£ç¢¼ã€‚而且,最é‡è¦çš„是,ä¸è¦ä½¿ç”¨Gitæ¨¹ä¾†ç¹žéŽ å¯©æŸ¥éŽç¨‹ã€‚ä¸æ™‚的將樹的摘è¦ç™¼ä½ˆåˆ°ç›¸é—œçš„列表ä¸ï¼Œåœ¨åˆé©æ™‚候請求linux-nextä¸ åŒ…å«è©²æ¨¹ã€‚ 如果其他人開始發é€è£œä¸ä»¥åŒ…å«åˆ°æ‚¨çš„樹ä¸ï¼Œä¸è¦å¿˜è¨˜å¯©é–±å®ƒå€‘。還è¦ç¢ºä¿æ‚¨ç¶è·æ£ç¢º 的作者信æ¯ï¼› git “amâ€å·¥å…·åœ¨é€™æ–¹é¢åšå¾—最好,但是如果補ä¸é€šéŽç¬¬ä¸‰æ–¹è½‰ç™¼çµ¦æ‚¨ï¼Œ 您å¯èƒ½éœ€è¦åœ¨è£œä¸ä¸æ·»åŠ “From:â€è¡Œã€‚ 請求拉å–時,請務必æ供所有相關信æ¯ï¼šæ¨¹çš„ä½ç½®ã€è¦æ‹‰å–的分支以åŠæ‹‰å–將導致的 æ›´æ”¹ã€‚åœ¨é€™æ–¹é¢ git request-pull 命令éžå¸¸æœ‰ç”¨ï¼›å®ƒå°‡æŒ‰ç…§å…¶ä»–開發人員所期望的 æ ¼å¼åŒ–請求,並檢查以確ä¿æ‚¨å·²è¨˜å¾—將這些更改推é€åˆ°å…¬å…±æœå‹™å™¨ã€‚ å¯©é–±è£œä¸ -------- 一些讀者顯然會åå°å°‡æœ¬ç¯€èˆ‡â€œé«˜ç´šä¸»é¡Œâ€æ”¾åœ¨ä¸€èµ·ï¼Œå› 爲å³ä½¿æ˜¯å‰›é–‹å§‹çš„å…§æ ¸é–‹ç™¼äººå“¡ 也應該審閱補ä¸ã€‚當然,沒有比查看其他人發佈的代碼更好的方法來å¸ç¿’å¦‚ä½•åœ¨å…§æ ¸ç’°å¢ƒ ä¸ç·¨ç¨‹äº†ã€‚æ¤å¤–,審閱者永é ä¾›ä¸æ‡‰æ±‚;通éŽå¯©é–±ä»£ç¢¼ï¼Œæ‚¨å¯ä»¥å°æ•´å€‹æµç¨‹åšå‡ºé‡å¤§è²¢ç»ã€‚ 審查代碼å¯èƒ½æ˜¯ä¸€å‰¯ä»¤äººç”Ÿç•çš„圖景,特別是å°ä¸€å€‹æ–°çš„å…§æ ¸é–‹ç™¼äººå“¡ä¾†èªªï¼Œä»–å€‘ å¯èƒ½æœƒå°å…¬é–‹è©¢å•ä»£ç¢¼æ„Ÿåˆ°ç·Šå¼µï¼Œè€Œé€™äº›ä»£ç¢¼æ˜¯ç”±é‚£äº›æœ‰æ›´å¤šç¶“驗的人發佈的。ä¸éŽï¼Œ å³ä½¿æ˜¯æœ€æœ‰ç¶“驗的開發人員編寫的代碼也å¯ä»¥å¾—到改進。也許å°ï¼ˆæ‰€æœ‰ï¼‰å¯©é–±è€…最好 的建è°æ˜¯ï¼šæŠŠå¯©é–±è©•è«–當æˆå•é¡Œè€Œä¸æ˜¯æ‰¹è©•ã€‚è©¢å•â€œåœ¨é€™æ¢è·¯å¾‘ä¸å¦‚何釋放鎖?†總是比說“這è£çš„鎖是錯誤的â€æ›´å¥½ã€‚ ä¸åŒçš„開發人員將從ä¸åŒçš„角度審查代碼。部分人會主è¦é—œæ³¨ä»£ç¢¼é¢¨æ ¼ä»¥åŠä»£ç¢¼è¡Œæ˜¯ å¦æœ‰å°¾éš¨ç©ºæ ¼ã€‚其他人會主è¦é—œæ³¨è£œä¸ä½œçˆ²ä¸€å€‹æ•´é«”實ç¾çš„變更是å¦å°å…§æ ¸æœ‰å¥½è™•ã€‚ åŒæ™‚也有人會檢查是å¦å˜åœ¨éŽ–å•é¡Œã€å †æ£§ä½¿ç”¨éŽåº¦ã€å¯èƒ½çš„安全å•é¡Œã€åœ¨å…¶ä»–地方 發ç¾çš„代碼é‡è¤‡ã€è¶³å¤ 的文檔ã€å°æ€§èƒ½çš„ä¸åˆ©å½±éŸ¿ã€ç”¨æˆ¶ç©ºé–“ABI更改ç‰ã€‚所有類型 的檢查,åªè¦å®ƒå€‘èƒ½å¼•å°Žæ›´å¥½çš„ä»£ç¢¼é€²å…¥å…§æ ¸ï¼Œéƒ½æ˜¯å—æ¡è¿Žå’Œå€¼å¾—的。