簡體中文 ▾ 主題 ▾ 最新版本 ▾ SubmittingPatches 上次更新於 2.52.0

此資訊專用於 Git 專案

請注意,如果您打算為 Git 專案本身做貢獻,此資訊才與您相關。它絕不是普通 Git 使用者的必讀內容。

指南

以下是一些為本專案貢獻程式碼的指南。還有一個 分步教程,其中涵蓋了許多相同的指南。

一個典型的補丁系列生命週期

為了幫助我們理解文件中後續各種指南的原因,首先讓我們瞭解一下這個專案典型的補丁系列是如何產生生命週期的。

  1. 你發現了一個痛點。你寫了程式碼。你不需要專案的任何預先授權。

    你的補丁將由郵件列表上的其他貢獻者審查,審查將用於評估各種事物的價值,例如你的補丁背後的基本思想(包括“它是否解決了值得解決的問題?”)、解決方案設計的原因以及實際實現。這裡的指南是為了讓你的補丁更容易被審查者理解。

  2. 你將補丁傳送到列表,並將可能需要了解此更改的人員抄送。你的目標**不是**要說服他人你正在構建的東西是好的。你的目標是獲得幫助,以一種比你獨自完成更好的方式來解決“痛點”。

    可能需要了解的人是那些處理過你正在修改的程式碼的人。這些人碰巧最有可能有足夠的知識來幫助你,但他們沒有義務幫助你(即,你請求他們幫助,而不是要求)。git log -p -- 你正在修改的區域 將有助於你找出他們是誰。

  3. 你會收到改進的評論和建議。你甚至可能以“在你的更改之上”的補丁形式收到它們。你被期望在郵件列表上以“全部回覆”的方式回應它們,同時在準備更新的補丁集時考慮它們。

  4. 潤色、完善並重新將你的補丁傳送到列表以及那些花費時間改進你補丁的人。回到步驟 (2)。

  5. 在上述迭代改進你的補丁時,維護者可能會從列表中挑選補丁並將其排隊到 seen 分支,以便人們可以輕鬆地使用它,而不必自己將補丁應用到他們的樹上。處於 seen 分支沒有任何其他含義。特別是,它不代表補丁在任何意義上都被“接受”。

  6. 當討論達成共識,認為最新迭代的補丁已經足夠好時,維護者會將該主題包含在每週傳送到郵件列表的“What’s cooking”報告中,標記為“Will merge to next”。這個決定主要由維護者做出,並得到那些參與審查討論的人的幫助。

  7. 在補丁合併到 _next_ 分支後,討論仍然可以繼續透過新增更多補丁來進一步改進它們,但當一個主題合併到 _next_ 時,預計每個人都同意該主題的範圍和基本方向是適當的,因此這種增量更新僅限於小的更正和潤色。當一個主題在 _next_ 分支中經過一段時間(例如 7 個日曆日)的調整後,不再需要進一步的修改,它將被合併到 _master_ 分支,等待成為下一個主要版本的一部分。

在接下來的部分中,列出了許多技術和約定,以幫助你的補丁在這種生命週期中得到有效審查。

選擇一個起點。

作為初步步驟,你必須首先為你的工作選擇一個起點。通常這意味著選擇一個分支,儘管從技術上講,它實際上是一個特定的提交(通常是分支的 HEAD 或尖端)。

有幾個重要的分支需要注意。即,有四個整合分支,如 gitworkflows[7] 中所述。

  • maint

  • master

  • next

  • seen

列表中較早的分支通常是比它們靠前的分支的後代。例如,maintmaster 是一個“更老”的分支,因為 master 通常在 maint 之上包含提交。

還有“主題”分支,它們包含其他貢獻者的工作。主題分支由 Git 維護者(在其 fork 中)建立,以組織郵件列表上當前傳入的貢獻集,並在定期的“What’s cooking in git.git”公告中列出。要找到主題分支的尖端,請執行 git log --first-parent master..seen 並查詢合併提交。此提交的第二個父提交是主題分支的尖端。

選擇正確起點的指導原則是:一般來說,始終將你的工作建立在你所做的更改相關的最舊整合分支之上(參見 gitworkflows[7] 中的“向上合併”)。這個原則意味著在絕大多數情況下,新工作的起點應該是 _maint_ 或 _master_ 的最新 HEAD 提交,具體取決於以下情況:

  • 如果你在已釋出的版本中修復錯誤,請使用 maint 作為起點(這可能意味著你必須在不使用 _master_ 中最近出現但未在已釋出版本中提供的尖端 API 功能的情況下修復問題)。

  • 否則(例如,如果你新增新功能),請使用 master

注意
在特殊情況下,一個在舊版本中引入的錯誤可能必須為比最近版本舊得多的使用者的釋出版本修復。 git describe --contains X 可能會將引入錯誤的提交 X 描述為 v2.30.0-rc2-gXXXXXX,並且該錯誤可能非常高影響,以至於我們可能需要為 Git 2.30.x 系列釋出一個新的維護版本,而“Git 2.41.0”是當前釋出的版本。在這種情況下,你可能想使用 2.30.x 系列的維護分支的尖端,這可能在 維護者的“獨立”倉庫 中的 maint-2.30 分支中可用。

這也意味著,如果你想讓你的工作有機會升級到 master,那麼 _next_ 或 _seen_ 不適合作為你工作的起點。它們根本不是為作為新工作的基礎而設計的;它們只是為了確保正在進行的主題能協同工作。這就是為什麼 _next_ 和 _seen_ 經常與郵件列表上的傳入補丁重新整合並強制推送以替換它們以前的版本。一個字面上建立在 _next_ 之上的主題,在沒有將 _next_ 中的所有其他尚未準備好的主題拖入的情況下,無法合併到 _master_。

例如,如果你正在進行跨整個系統的更改,而其他人也在進行他們自己的跨整個系統的更改,那麼你的工作可能會與其他人的工作產生嚴重的重疊。這種情況可能會誘使你使用 _next_ 作為你的起點(因為它包含了其他人的工作),但這樣做意味著你不僅依賴於其他人的工作,還依賴於已經整合到 _next_ 中的來自其他貢獻者的所有其他隨機事物。並且一旦 _next_ 被新版本更新,你的所有工作都將需要重新定位,以便維護者可以乾淨地應用它們。

在絕對必須依賴 _next_ 中已存在但 _master_ 中不存在的少數主題分支的真正特殊情況下,你可能想透過 fork _master_ 並將所需的主題分支合併到其中來建立自己的自定義基礎分支。然後你可以在這個基礎分支之上工作。但請記住,這個基礎分支只會對你個人可見。所以當你準備將你的補丁傳送到列表時,請務必在你的封面信中說明你是如何建立它的。這個關鍵資訊將允許其他人復現你的基礎分支,以便他們可以試用你的工作。

最後,請注意,系統的某些部分有專門的維護者,他們有自己的獨立原始碼倉庫(參見下面的“子系統”部分)。

為邏輯上獨立的更改建立單獨的提交。

除非你的補丁非常微小,否則你不應該傳送一個在你的工作樹和你的提交頭之間生成的補丁。相反,始終使用完整的提交訊息建立一個提交,並從你的倉庫生成一系列補丁。這是一個很好的習慣。

對更改提供足夠詳細的解釋,以便人們能夠判斷它是否是一件好事,而無需閱讀實際的補丁文字來確定程式碼在多大程度上實現瞭解釋的承諾。

如果你的描述開始變得太長,這表明你可能需要將你的提交分成更細粒度的部分。也就是說,能夠幫助審查者檢查補丁並使未來的維護者理解程式碼的補丁是最漂亮的。主題總結了要點的描述,解釋了更改的動機、所採取的方法,以及如果相關,與先前版本有何實質性不同,這些都是很好的內容。

確保你為要修復的錯誤提供了測試。有關指導,請參見 t/README

新增新功能時,確保你有新的測試來表明功能在應該觸發時觸發了新行為,並且在不應該觸發時沒有觸發。在任何程式碼更改後,確保整個測試套件都能透過。修復錯誤時,確保你有新的測試,如果有人意外破壞了你修復的內容,這些測試會失敗,以避免迴歸。另外,嘗試將你的工作合併到 _next_ 和 _seen_ 中,並確保測試仍然透過;其他人仍在進行中的主題可能與你正在進行的主題產生意外的互動。

推送到 https://github.com/git/git 的 fork 將使用他們的 CI 整合在 Linux、Mac 和 Windows 上測試你的更改。有關詳細資訊,請參閱 GitHub CI 部分。

不要忘記更新文件以描述已更新的行為,並確保生成的文件集格式正確(嘗試 Documentation/doc-diff 指令碼)。

我們目前在拼寫和語法上混合了美式和英式英語的規範,這有些不幸。然而,一個巨大的補丁,為了糾正不一致性而觸及了所有地方的檔案,是不會受歡迎的。這種補丁可能與其他更改產生的潛在衝突是不值得的。我們寧願透過小的、易於理解的補丁,作為做一些附近實際工作(例如,為了清晰而重寫一段話,同時將英式拼寫轉換為美式拼寫)的副作用,來逐漸調和不一致性,偏向美式英語。明顯的拼寫錯誤(“teh → the”)則更受歡迎,最好作為獨立於其他文件更改的補丁提交。

哦,還有一件事。我們對空格很挑剔。確保你的更改不會觸發 templates/hooks--pre-commit 中提供的示例預提交鉤子的錯誤。為了幫助確保這種情況不會發生,在提交更改之前,請執行 git diff --check

好好描述你的更改。

解釋你更改的日誌訊息與更改本身一樣重要。你的程式碼可能寫得很清楚,有程式碼內註釋來充分解釋它如何與周圍的程式碼協同工作,但那些將來需要修復或增強你的程式碼的人需要知道你的程式碼**為什麼**這樣做,有幾個原因:

  1. 你的程式碼可能做的事情與你想要的有所不同。寫下你實際想要達成的目標將有助於他們修復你的程式碼並使其按預期工作(此外,你在編寫總結其背後思想的日誌訊息時,常常會發現自己的錯誤)。

  2. 你的程式碼可能在做一些只滿足你即時需求的事情(例如,“對目錄執行 X”而不實現甚至不設計對檔案要做什麼)。寫下你為什麼排除程式碼不執行的內容將有助於指導未來的開發者。寫下“我們對目錄執行 X,因為目錄具有特性 Y”將有助於他們推斷“哦,檔案也具有相同的特性 Y,那麼對它們執行 X 可能也有意義?”。說“我們不對檔案做同樣的事情,因為……”將幫助他們決定理由是否充分(在這種情況下,他們就不會浪費時間將你的程式碼擴充套件到覆蓋檔案),或者他們會以不同的方式思考(在這種情況下,他們可以解釋為什麼他們將你的程式碼擴充套件到也覆蓋檔案)。

你的日誌訊息的目標是傳達你更改背後的**原因**,以幫助未來的開發者。審查者還將確保你提議的日誌訊息能夠很好地實現這一目的。

提交訊息的第一行應該是簡短的描述(50 個字元是軟限制,參見 git-commit[1] 的 DISCUSSION),並且應省略句號。在大多數情況下,還習慣性地在第一行前面加上“area: ”,其中 area 是一個檔名或識別符號,表示要修改的程式碼的通用區域,例如:

  • doc: 澄清 sign-off 和 pgp-signing 之間的區別

  • githooks.txt: 改進介紹部分

如果不確定使用哪個識別符號,請執行 git log --no-merges 檢視你正在修改的檔案,以瞭解當前的約定。

“area:”字首後面的標題行省略了末尾的句號,並且其首個單詞不首字母大寫(不首字母大寫僅適用於標題中“area:”字首之後的單詞),除非有其他原因需要首字母大寫。例如,“doc: clarify…​”,而不是“doc: Clarify…​”,或“githooks.txt: improve…​”,而不是“githooks.txt: Improve…​”。但“refs: HEAD is also treated as a ref”是正確的,因為即使在句子中間,我們也全部大寫 HEAD

正文應提供有意義的提交訊息,該訊息

  1. 解釋了更改試圖解決的問題,即在沒有更改的情況下當前程式碼有什麼問題。

  2. 證明了更改解決問題的方式,即為什麼更改後的結果更好。

  3. 考慮過但被放棄的備選解決方案,如果有的話。

描述現狀的問題陳述以現在時態書寫。寫“程式碼在給定輸入 Y 時執行 X”,而不是“程式碼過去在給定輸入 X 時執行 Y”。你不必說“目前”——問題陳述中的現狀是關於**沒有**你更改的程式碼,按照專案約定。

用命令式語氣描述你的更改,例如,“make xyzzy do frotz”而不是“[This patch] makes xyzzy do frotz”或“[I] changed xyzzy to do frotz”,就像你正在給程式碼庫下達命令來改變其行為一樣。儘量確保你的解釋無需外部資源就能理解。不要提供指向郵件列表存檔的 URL,而是總結討論的相關要點。

你可能想引用歷史記錄中“更穩定”部分(即在 _maint_、_master_ 和 _next_ 等分支上)的另一個提交,有幾個原因:

  1. 引入了你正在修復的錯誤的根本原因的提交。

  2. 引入了你正在增強的功能的提交。

  3. 你在將你的工作試探性合併到 _next_ 和 _seen_ 進行測試時,與你的工作發生衝突的提交。

當你引用一個更穩定分支(如 _master_、_maint_ 和 _next_)上的提交時,請使用“縮寫雜湊(主題,日期)”格式,如下所示:

	Commit f86a374 (pack-bitmap.c: fix a memleak, 2015-03-30)
	noticed that ...

gitk 的“複製提交引用”命令可以用於獲取此格式(主題用雙引號括起來),或者呼叫 git show

	git show -s --pretty=reference <commit>

或者,在不支援 --pretty=reference 的舊版本 Git 上:

	git show -s --date=short --pretty='format:%h (%s, %ad)' <commit>

透過新增你的 Signed-off-by 尾部來認證你的工作

為了改進跟蹤誰做了什麼,我們要求你透過“簽署”你的補丁來認證你編寫了該補丁或有權在與我們相同的許可證下分發它。沒有簽署,我們就無法接受你的補丁。

如果你(並且僅當你)認證以下 D-C-O

開發者起源證明 1.1

透過向本專案貢獻,我證明:

  1. 該貢獻是由我全部或部分建立的,並且我有權根據檔案中指明的開源許可證提交它;或

  2. 該貢獻基於我所知的、受適當開源許可證保護的先前工作,並且根據該許可證,我有權(除非被允許以不同的許可證提交)以相同開源許可證(包括由我全部或部分建立的修改)提交該工作,如檔案中所示;或

  3. 該貢獻是由其他人直接提供給我的,該其他人已證明 (a), (b) 或 (c),並且我未對其進行修改。

  4. 我理解並同意本專案和該貢獻是公開的,並且貢獻的記錄(包括我提交的所有個人資訊,包括我的簽名)將被無限期維護,並可能根據本專案或所涉及的開源許可證進行重新分發。

你會在你的提交中新增一個“Signed-off-by”尾部,它看起來像這樣:

	Signed-off-by: Random J Developer <random@developer.example.org>

如果你使用 -s 選項執行 git-commit 命令,Git 會自動新增這一行。

請注意,根據上述 D-C-O 規則,在轉發展其他人的補丁時,你也可以新增自己的 Signed-off-by 尾部。事實上,我們鼓勵這樣做。不要忘記在正文中新增一個“From: ”行,以正確地將更改歸因於其真正的作者(參見上面的 (2))。

此程式最初來自 Linux 核心專案,因此我們的規則與之非常相似,但簽署你的補丁的確切含義因專案而異,所以可能與你習慣的專案不同。

請在 Signed-off-by 尾部使用已知的身份,因為我們無法接受匿名貢獻。使用你真實姓名的某種形式很常見,但並非強制要求。我們認識到有些貢獻者對此感到不舒服,或者更喜歡以化名或首選名稱貢獻,我們可以接受你的補丁,只要你使用的姓名和電子郵件是獨特、可識別且不具誤導性的。

此政策的目標是使我們擁有足夠的資訊,以便在出現關於你貢獻的問題時能夠聯絡到你。

如果你願意,可以在末尾新增額外的尾部:

  1. Reported-by: 用於表彰發現補丁試圖修復的錯誤的人。

  2. Acked-by: 表示對補丁所修改的區域更熟悉的人喜歡這個補丁。

  3. Reviewed-by: 與其他尾部不同,只能由審查者在對補丁進行詳細分析並完全滿意後提供。

  4. Tested-by: 用於表明某人應用了補丁並發現它產生了預期效果。

  5. Co-authored-by: 用於表示人們在提交補丁之前交換了補丁草稿。

  6. Helped-by: 用於表彰那些在不提供具體補丁形式的情況下提出更改想法的人。

  7. Mentored-by: 用於表彰那些作為指導計劃(例如 GSoC 或 Outreachy)的一部分幫助開發補丁的人。

  8. Suggested-by: 用於表彰那些提出補丁想法的人。

雖然在情況需要時你也可以建立自己的尾部,但我們鼓勵你使用上面突出顯示的此專案中的常用尾部之一。

只將尾部的第一個字母大寫,即偏好“Signed-off-by”而不是“Signed-Off-By”,以及“Acked-by:”而不是“Acked-By”。

人工智慧 (AI) 的使用

開發者起源證明要求貢獻者證明他們知道其貢獻的來源,並且他們有權在專案的許可證下提交它。當提交大量由 AI 工具生成的內容時,尚不清楚這是否能在法律上滿足要求。

AI 生成內容的另一個問題是,AI 仍然經常會產生幻覺或僅僅產生不好的程式碼、提交訊息、文件或輸出,即使你指出了它們的錯誤。

為了避免這些問題,我們將拒絕任何看起來是 AI 生成的、聽起來過於正式或冗長、看起來像 AI 垃圾、表面上看起來不錯但沒有意義,或者傳送者不理解或無法解釋的內容。

我們強烈建議謹慎負責地使用 AI 工具。

貢獻者透過使用 AI 來指導和幫助他們逐步自行完成解決方案,而不是要求一個他們然後大部分複製貼上的完整解決方案,從而受益更多。他們還可以使用 AI 來幫助除錯,或者檢查明顯的錯誤、可以改進的地方、不符合我們的風格、指南或反饋的地方,然後再發送給我們。

使用 Git 工具從你的提交中生成補丁。

基於 Git 的 diff 工具生成 unidiff,這是首選格式。

如果你的補丁涉及檔案重新命名,你無需擔心使用 git diffgit format-patch 的 -M 選項。接收方可以很好地處理它們。

請確保你的補丁不添加註釋掉的除錯程式碼,或包含任何與你的補丁試圖達成的目標無關的額外檔案。生成補丁後,請務必檢查以確保準確性。在傳送之前,請確保它能幹淨地應用到你在“選擇起點”部分選擇的起點上。

注意
從審查你的補丁的人的角度來看,_master_ 分支是預設的預期起點。因此,如果你選擇了不同的起點,請在你的封面信中說明這個選擇。

傳送你的補丁。

選擇你的審查者

注意
可能與安全相關的補丁應私下提交給 Git 安全郵件列表[1],而不是公共郵件列表。

將你的補丁的“To:”設定為郵件列表,將“cc:”列出參與你修改區域的人員(contrib/contacts/ 中的 git-contacts 指令碼[2] 可以幫助識別他們),以徵求評論和審查。此外,當你將你的主題試探性合併到 _next_ 和 _seen_ 時,你可能注意到了其他人的工作與你的更改發生衝突。很有可能這些人可能很瞭解你正在修改的區域。

如果你正在使用 send-email,你可以像這樣將 git contacts 的輸出饋送給它:

	git send-email --cc-cmd='perl contrib/contacts/git-contacts' feature/*.patch

在列表達成共識認為應用該補丁是個好主意後,用“To:”設定為維護者[3] 和“cc:”列表[4] 來重新發送它以進行包含。這一點在維護者沒有大量參與討論,而是將審查委託給信任的其他人時尤其重要。

不要忘記新增如 Acked-by:, Reviewed-by:Tested-by: 等尾部,以表彰幫助過你補丁的人,並在傳送最終版本進行包含時“cc:”他們。

format-patchsend-email

如果可能,請學習使用 format-patchsend-email。這些命令針對傳送補丁的工作流程進行了最佳化,避免了你現有的電子郵件客戶端(通常針對“multipart/*”MIME 型別電子郵件進行了最佳化)可能使你的補丁無法使用的許多方式。

注意
這裡我們概述了使用 format-patchsend-email 的流程,但你也可以使用 GitGitGadget 來發送你的補丁(參見 MyFirstContribution)。

Git 郵件列表上的人們需要能夠閱讀和評論您提交的更改。開發者能夠使用標準的電子郵件工具“引用”您的更改,以便他們可以評論您程式碼的特定部分,這一點非常重要。因此,每個補丁都應該“內聯”提交到一個單獨的訊息中。

補丁系列的所有後續版本和其他相關補丁都應該分組到自己的電子郵件主題中,以幫助讀者找到該系列的所有部分。為此,請將它們作為回覆傳送,回覆物件可以是額外的“封面信”(見下文)、第一個補丁或 respective preceding patch。以下是有關如何提交補丁系列更新版本的分步指南

如果您的日誌訊息(包括您在Signed-off-by尾註中的姓名)無法用 ASCII 字元書寫,請確保您使用正確的編碼傳送訊息。

警告
請注意您的 MUA(郵件使用者代理)的自動換行可能會損壞您的補丁。不要複製貼上您的補丁;如果您不小心,可能會丟失製表符。

在主題行前加上 [PATCH] 是一個常見的約定。這讓人們可以輕鬆地區分補丁和其他電子郵件討論。還鼓勵在方括號中使用除 PATCH 之外的標記來描述補丁的性質。例如,[RFC PATCH](其中 RFC 代表“徵求意見”)通常用於表示補丁在被接受之前需要進一步討論,而 [PATCH v2]、[PATCH v3] 等通常在您傳送先前傳送內容的更新時使用。

git format-patch 命令遵循最佳實踐來格式化電子郵件訊息的正文。在補丁的開頭應該是您的提交訊息,以Signed-off-by尾註結束,然後是一行由三個破折號組成,後面跟著 diffstat 資訊和補丁本身。如果您轉發他人的補丁,可以選擇在電子郵件訊息的開頭,在提交訊息開始之前,放置一個“From: ”行來命名該人。要將主題中的預設“[PATCH]”更改為“[<text>]”,請使用git format-patch --subject-prefix=<text>。作為快捷方式,您可以使用--rfc代替--subject-prefix="RFC PATCH",或使用-v <n>代替--subject-prefix="PATCH v<n>"

您通常想在提交訊息本身之外新增有關補丁的額外解釋。將此類“封面信”材料放在三破折號行和 diffstat 之間。對於需要多輪審查和討論的補丁,可以在每次迭代之間的更改說明儲存在 Git-notes 中,並透過git format-patch --notes自動插入到三破折號行之後。

這是實驗性的.

當傳送一個主題時,您可以選擇性地提出一個主題名稱和/或一段摘要,該摘要應出現在“正在進行的開發”報告中,用於解釋該主題。如果您選擇這樣做,請寫一個 2-5 行的段落,它能很好地放入我們的發行說明中(請參閱 Documentation/RelNotes/* 檔案中的許多專案符號條目作為示例),並將其作為封面信的第一段(如果包含建議的主題名稱,則為第二段)。如果建議主題名稱,請使用“XX/your-topic-name”格式,其中“XX”是主要作者首字母的佔位符,“your-topic-name”是對您的主題做什麼的簡短、由破折號分隔的描述。對於單個補丁系列,請使用前面所述的三破折號線和 diffstat 之間的空間。

如果您的補丁系列是更廣泛工作的一部分,該工作跨越多個補丁系列,請簡要描述更廣泛的目標,並說明當前系列如何適應該目標。如果您建議一個主題名稱(如上面部分所述),可以考慮“XX/the-broader-goal-part-one”、“XX/the-broader-goal-part-two”等。

請勿將補丁作為 MIME 附件傳送,無論是否壓縮。不要讓您的電子郵件客戶端傳送 quoted-printable 編碼。不要讓您的電子郵件客戶端傳送 format=flowed,這會破壞您補丁中的空格。許多流行的電子郵件應用程式並不總是將 MIME 附件傳輸為純文字,這使得無法評論您的程式碼。MIME 附件也需要更多的時間來處理。這不會降低您的 MIME 附件更改被接受的可能性,但會增加被推遲的可能性。

例外:如果您的郵件客戶端損壞了補丁,有人可能會要求您使用 MIME 重新發送它們,這是可以的。

請勿 PGP 簽名您的補丁。您的維護者或其他列表成員很可能沒有您的 PGP 金鑰,並且也不會費心去獲取。您的補丁不是根據您的身份來判斷的;一個來自未知來源的優秀補丁比一個來自已知、受尊敬但做得不好或做錯事的來源的補丁更有可能被接受。

如果您真的真的真的真的想做一個 PGP 簽名補丁,請將其格式化為“multipart/signed”,而不是一個以-----BEGIN PGP SIGNED MESSAGE-----開頭的 text/plain 訊息。那不是 text/plain,而是其他東西。

處理衝突和迭代補丁

在修改您的補丁時,承認與其他正在進行的開發主題可能發生衝突的可能性非常重要。為了有效地處理這些潛在的衝突,請遵循下面概述的推薦步驟

  1. 建立在合適的基分支上,請參閱上面的部分,然後格式化補丁系列。如果您正在就地進行“rebase -i”來更新上一輪,這將重用之前的基,因此(2)和(3)可能會變得微不足道。

  2. 找到上一輪被排隊的基

    $ mine='kn/ref-transaction-symref'
    $ git checkout "origin/seen^{/^Merge branch '$mine'}...master"
  3. 應用您的 format-patch 結果。有兩種情況

    1. 一切都乾淨地應用並且測試透過。轉到(4)。

    2. 一切都乾淨地應用,但構建失敗或測試失敗,或者根本不乾淨地應用。

      在後一種情況下,您會遇到文字衝突或語義衝突,這些衝突來自於舊基與您在(1)中用於構建的基之間的差異。確定是什麼導致了中斷(例如,自(2)使用的基到(1)使用的基以來,可能有一個或兩個主題已合併)。

      檢出最新的origin/master(它可能比(2)使用的基更新),在那裡“merge --no-ff”您新依賴的主題,並使用合併的結果作為基,重新構建系列並再次測試。從最後一次這樣的合併執行 format-patch 到您的主題的尖端。如果您做了

      $ git checkout origin/master
      $ git merge --no-ff --into-name kn/ref-transaction-symref fo/obar
      $ git merge --no-ff --into-name kn/ref-transaction-symref ba/zqux
      ... rebuild the topic ...

      那麼你只需要在這些“準備工作”合併之上格式化你的主題,例如

      $ git format-patch "HEAD^{/^Merge branch 'ba/zqux'}"..HEAD

      不要忘記在封面信中寫上你做了這些,包括你現在在master之上的主題。然後轉到(4)。

  4. 將您的主題與nextseen進行試合併,例如

    $ git checkout --detach 'origin/seen'
    $ git revert -m 1 <the merge of the previous iteration into seen>
    $ git merge kn/ref-transaction-symref

    如果您的主題的先前迭代已在seen中(如本例),則需要“revert”。您可以選擇從頭開始重建 master..origin/seen,同時排除您之前的迭代,這可能更接近維護者端發生的情況。

    這次試合併可能會發生衝突。它主要是為了檢視其他主題可能與您的主題發生哪些衝突。換句話說,您不必依賴它來讓您的主題在master上工作。如果您的主題比其他主題更早合併到 next,那麼解決衝突可能成為其他主題所有者的工作。

    在封面信中記下您看到的衝突。您不一定需要解決它們,但這將是一個很好的機會來了解您在相關領域中正在做什麼。

    $ git checkout --detach 'origin/next'
    $ git merge kn/ref-transaction-symref

    這是為了檢視您的主題與其他正在進行的主題可能發生的衝突。如果(3)-2 在更新的 master 和從next獲取的依賴主題之上準備了一個基,那麼這應該不會發生衝突。除非情況嚴重(一種判斷方法是嘗試使用舊迭代進行相同的試合併,這可能會以類似的方式發生衝突),否則預計這將在維護者端處理(如果變得無法管理,當我收到您的補丁時,我會要求 rebasing)。

具有專用維護者的子系統

系統的一些部分有專門的維護者,他們有自己的儲存庫。

  • git-gui/ 來自 git-gui 專案,由 Johannes Sixt 維護

    https://github.com/j6t/git-gui
    Contibutions should go via the git mailing list.
  • gitk-git/ 來自 gitk 專案,由 Johannes Sixt 維護

    https://github.com/j6t/gitk
    Contibutions should go via the git mailing list.
  • po/ 來自本地化協調員 Jiang Xin

    https://github.com/git-l10n/git-po/

這些部分的補丁應基於他們的樹。

  • “Git 文件翻譯”專案,由 Jean-Noël Avila 領導,負責翻譯我們的文件頁面。他們的工作產品與該專案分開維護,不屬於我們的樹。

    https://github.com/jnavila/git-manpages-l10n/

GitHub CI

透過 GitHub 賬戶,您可以使用 GitHub CI 在 Linux、Mac 和 Windows 上測試您的更改。請參閱https://github.com/git/git/actions/workflows/main.yml 獲取近期 CI 執行示例。

按照以下步驟進行初始設定

  1. https://github.com/git/git Fork 到您的 GitHub 賬戶。您可以在此處找到有關如何 Fork 的詳細說明:https://help.github.com/articles/fork-a-repo/

初始設定後,每當您將新更改推送到您 Fork 的 Git 儲存庫到 GitHub 時,CI 都會執行。您可以在此處監控所有分支的測試狀態:https://github.com/<Your GitHub handle>/git/actions/workflows/main.yml

如果一個分支未能透過所有測試用例,它將被標記為一個紅色的x,而不是一個綠色的勾號。在這種情況下,您可以點選失敗的作業並導航到“ci/run-build-and-tests.sh”和/或“ci/print-test-failures.sh”。您還可以下載“Artifacts”,這些是 zip 存檔,其中包含用於除錯的測試資料的 tar(或 zip)存檔。

然後修復問題並將您的修復推送到您的 GitHub Fork。這將觸發新的 CI 構建,以確保所有測試都透過。

MUA 特定提示

我收到或從郵件列表中提取的一些補丁存在常見的損壞模式。請確保您的 MUA 設定正確,不會損壞空格。

請參閱git-format-patch[1] 的DISCUSSION部分,瞭解如何透過將補丁郵寄給自己並使用git-am[1] 進行應用來檢查您的補丁。

在進行此操作時,請檢查試用應用補丁後產生的提交日誌訊息。如果提交中的內容與您希望看到的內容不完全一致,那麼您的維護者很可能會在應用您的補丁時手動編輯日誌訊息。諸如“Hi, this is my first patch.\n”之類的文字,如果您確實想將其放入補丁郵件中,應該放在表示提交訊息結束的三破折號線之後。

Pine

(Johannes Schindelin)

I don't know how many people still use pine, but for those poor
souls it may be good to mention that the quell-flowed-text is
needed for recent versions.

... the "no-strip-whitespace-before-send" option, too. AFAIK it
was introduced in 4.60.

(Linus Torvalds)

And 4.58 needs at least this.

diff-tree 8326dd8350be64ac7fc805f6563a1d61ad10d32c (from e886a61f76edf5410573e92e38ce22974f9c40f1)
Author: Linus Torvalds <torvalds@g5.osdl.org>
Date:   Mon Aug 15 17:23:51 2005 -0700

    Fix pine whitespace-corruption bug

    There's no excuse for unconditionally removing whitespace from
    the pico buffers on close.

diff --git a/pico/pico.c b/pico/pico.c
--- a/pico/pico.c
+++ b/pico/pico.c
@@ -219,7 +219,9 @@ PICO *pm;
	    switch(pico_all_done){	/* prepare for/handle final events */
	      case COMP_EXIT :		/* already confirmed */
		packheader();
+#if 0
		stripwhitespace();
+#endif
		c |= COMP_EXIT;
		break;

(Daniel Barkalow)

> A patch to SubmittingPatches, MUA specific help section for
> users of Pine 4.63 would be very much appreciated.

Ah, it looks like a recent version changed the default behavior to do the
right thing, and inverted the sense of the configuration option. (Either
that or Gentoo did it.) So you need to set the
"no-strip-whitespace-before-send" option, unless the option you have is
"strip-whitespace-before-send", in which case you should avoid checking
it.

Thunderbird、KMail、GMail

請參閱git-format-patch[1] 的MUA-SPECIFIC HINTS 部分。

Gnus

*Summary*緩衝區中的“|”可以將當前訊息透過管道傳輸到外部程式,這是驅動git am的便捷方法。但是,如果訊息是 MIME 編碼的,則透過管道傳輸到程式的是您在*Article*緩衝區中解開 MIME 後看到的表示。這通常不是您想要的,原因有兩個。它傾向於搞砸非 ASCII 字元(最明顯的是人名),以及空格(在補丁中是致命的)。執行“C-u g”以原始形式顯示訊息,然後再使用“|”來執行管道,可以解決這個問題。


1. Git 安全郵件列表:git-security@googlegroups.com
2. `contrib/` 下的指令碼不是核心 `git` 二進位制檔案的一部分,必須直接呼叫。克隆 Git 程式碼庫並執行 `perl contrib/contacts/git-contacts`。
3. 當前維護者:gitster@pobox.com
4. 郵件列表:git@vger.kernel.org