Git
English ▾ 主題 ▾ 最新版本 ▾ git-apply 最後更新於 2.47.0

名稱

git-apply - 將修補程式套用至檔案和/或索引

概要

git apply [--stat] [--numstat] [--summary] [--check]
	  [--index | --intent-to-add] [--3way] [--ours | --theirs | --union]
	  [--apply] [--no-add] [--build-fake-ancestor=<file>] [-R | --reverse]
	  [--allow-binary-replacement | --binary] [--reject] [-z]
	  [-p<n>] [-C<n>] [--inaccurate-eof] [--recount] [--cached]
	  [--ignore-space-change | --ignore-whitespace]
	  [--whitespace=(nowarn|warn|fix|error|error-all)]
	  [--exclude=<path>] [--include=<path>] [--directory=<root>]
	  [--verbose | --quiet] [--unsafe-paths] [--allow-empty] [<patch>…​]

描述

讀取提供的 diff 輸出(即「修補程式」)並將其套用至檔案。從存放庫中的子目錄執行時,會忽略目錄外的已修補路徑。使用 --index 選項時,修補程式也會套用至索引,而使用 --cached 選項時,修補程式只會套用至索引。沒有這些選項時,命令只會將修補程式套用至檔案,且不要求檔案位於 Git 存放庫中。

此命令會套用修補程式,但不會建立 commit。使用 git-am[1]git-format-patch[1] 產生和/或以電子郵件接收的修補程式建立 commit。

選項

<patch>…​

要從中讀取修補程式的檔案。- 可用於從標準輸入讀取。

--stat

輸出輸入的 diffstat,而非套用修補程式。關閉「套用」。

--numstat

--stat 類似,但會以十進位標記法顯示新增和刪除的行數,以及未縮寫的路徑名稱,使其更適合機器讀取。對於二進位檔案,會輸出兩個 -,而不是說 0 0。關閉「套用」。

--summary

輸出從 git diff 擴充標頭取得的精簡資訊摘要,例如建立、重新命名和模式變更,而非套用修補程式。關閉「套用」。

--check

查看修補程式是否適用於目前的工作樹和/或索引檔,並偵測錯誤,而非套用修補程式。關閉「套用」。

--index

將修補程式套用至索引和工作樹 (或僅檢查是否能乾淨地套用至索引和工作樹,如果 --check 生效的話)。請注意,--index 預期相關路徑的索引項目和工作樹副本相同 (其內容和中繼資料 (例如檔案模式) 必須相符),且如果它們不相符,即使修補程式能乾淨地套用至索引和工作樹 (獨立) 也會引發錯誤。

--cached

只將修補程式套用至索引,而不會更動工作樹。如果 --check 生效,則僅檢查是否能乾淨地套用至索引項目。

--intent-to-add

只將修補程式套用至工作樹時,將新的檔案標記為稍後加入索引 (請參閱 git-add[1] 中的 --intent-to-add 選項)。除非在 Git 存放庫中執行且未指定 --index,否則會忽略此選項。請注意,--index 可以由其他選項 (例如 --cached--3way) 隱含。

-3
--3way

如果修補程式記錄它應套用至的 blob 識別,且我們在本機有這些 blob,則嘗試進行 3 向合併,可能會將衝突標記留在工作樹的檔案中,讓使用者解決。此選項隱含 --index 選項,除非使用 --cached 選項,且與 --reject 選項不相容。與 --cached 選項搭配使用時,任何衝突都會保留在快取中的較高階段。

--ours
--theirs
--union

不要將衝突留在檔案中,而是偏好行中的我們 (或他們或兩者) 方來解決衝突。需要 --3way。

--build-fake-ancestor=<file>

較新的 git diff 輸出針對每個 blob 內嵌 索引資訊,以協助識別修補程式套用至的原始版本。提供此旗標時,且如果 blob 的原始版本在本機可用,則會建立包含這些 blob 的暫時索引。

當遇到純模式變更 (沒有索引資訊) 時,會改為從目前索引讀取資訊。

-R
--reverse

反向套用修補程式。

--reject

為了確保原子性,如果某些程式碼區塊未套用,git apply 預設會使整個修補程式失敗,且不會更動工作樹。此選項會使其套用適用的修補程式部分,並將拒絕的程式碼區塊保留在對應的 *.rej 檔案中。

-z

當提供 --numstat 時,不要修改路徑名稱,而是使用以 NUL 結尾的機器可讀格式。

如果沒有此選項,則會如配置變數 core.quotePath 所述 (請參閱 git-config[1]),以引號括住包含「不尋常」字元的路徑名稱。

-p<n>

從傳統 diff 路徑中移除 <n> 個開頭路徑元件 (以斜線分隔)。例如,使用 -p2 時,針對 a/dir/file 的修補程式會直接套用至 file。預設值為 1。

-C<n>

確保每個變更前後至少符合 <n> 行周圍的內容。如果周圍的內容行較少,則必須全部相符。預設情況下,永遠不會忽略任何內容。

--unidiff-zero

預設情況下,git apply 預期要套用的修補程式是統一 diff,且至少有一行內容。這會提供良好的安全措施,但在套用以 --unified=0 產生的 diff 時會失效。若要略過這些檢查,請使用 --unidiff-zero

請注意,基於上述原因,不建議使用無內容修補程式。

--apply

如果您使用上述任何標示為「關閉 apply」的選項,則 git apply 會讀取並輸出要求的資訊,而不會實際套用修補程式。在這些旗標之後提供此旗標,也會套用修補程式。

--no-add

套用修補程式時,忽略修補程式所做的加入。這可用於透過先執行它們的 diff,然後使用此選項套用結果來擷取兩個檔案之間的共用部分,這會套用刪除部分,但不會套用加入部分。

--allow-binary-replacement
--binary

過去,我們不允許在未經使用者明確許可的情況下套用二進位修補程式,而此旗標是執行此操作的方式。目前,我們一律允許套用二進位修補程式,因此這是無作業。

--exclude=<path-pattern>

不要將變更套用至符合指定路徑模式的檔案。在匯入修補程式集時,如果您想要排除某些檔案或目錄,這會很有用。

--include=<path-pattern>

將變更套用至符合指定路徑模式的檔案。在匯入修補程式集時,如果您想要包含某些檔案或目錄,這會很有用。

使用 --exclude--include 模式時,會依它們在命令列中出現的順序檢查它們,且第一個符合的模式會決定是否使用每個路徑的修補程式。如果命令列上沒有包含模式,則預設會使用不符合任何包含/排除模式的路徑修補程式,如果有任何包含模式,則會忽略它。

--ignore-space-change
--ignore-whitespace

套用修補程式時,如果需要,則會忽略內容行中的空格變更。內容行將保留其空格,且無論 --whitespace 選項的值為何,都不會進行空格修正。不過,仍會修正新行。

--whitespace=<action>

套用修補程式時,偵測有空格錯誤的新行或修改過的行。哪些被視為空格錯誤是由 core.whitespace 配置控制。預設情況下,結尾空格 (包括僅由空格組成的行) 和緊接在行初始縮排內的 Tab 字元之前的空格字元會被視為空格錯誤。

預設情況下,命令會輸出警告訊息,但會套用修補程式。當 git-apply 用於統計資料而不是套用修補程式時,它預設為 nowarn

您可以使用不同的 <action> 值來控制此行為

  • nowarn 關閉尾隨空白警告。

  • warn 針對少數此類錯誤輸出警告,但會直接套用修補程式(預設)。

  • fix 針對少數此類錯誤輸出警告,並在修正後套用修補程式(strip 是同義詞——該工具過去僅將尾隨空白字元視為錯誤,而修復方法涉及 *strip* 它們,但現代 Git 會做更多處理)。

  • error 針對少數此類錯誤輸出警告,並拒絕套用修補程式。

  • error-allerror 類似,但會顯示所有錯誤。

--inaccurate-eof

在某些情況下,某些版本的 diff 無法正確偵測到檔案末尾缺少換行符號。 因此,此類 diff 程式建立的修補程式無法正確記錄不完整的行。 此選項透過解決此錯誤,增加了對套用此類修補程式的支援。

-v
--verbose

向 stderr 回報進度。 預設情況下,僅會印出關於目前正在套用的修補程式的訊息。 此選項將會回報額外資訊。

-q
--quiet

抑制 stderr 輸出。 將不會印出關於修補程式狀態和進度的訊息。

--recount

不要信任 hunk 標頭中的行數計數,而是透過檢查修補程式來推斷它們(例如,在編輯修補程式而未適當調整 hunk 標頭之後)。

--directory=<root>

在所有檔案名稱前加上 <root>。 如果也傳遞了 "-p" 引數,則會在加上新根目錄之前套用。

例如,一個關於將 a/git-gui.sh 更新為 b/git-gui.sh 的修補程式,可以透過執行 git apply --directory=modules/git-gui,套用至工作樹中的檔案 modules/git-gui/git-gui.sh

--unsafe-paths

預設情況下,影響工作區域外部(Git 控制的工作樹,或當 "git apply" 用作 GNU patch 的替代品時的當前工作目錄)的修補程式,會被視為錯誤(或惡作劇)而拒絕。

git apply 用作「更好的 GNU patch」時,使用者可以傳遞 --unsafe-paths 選項來覆寫此安全檢查。 當使用 --index--cached 時,此選項無效。

--allow-empty

對於不包含 diff 的修補程式,不要傳回錯誤。 這包括空修補程式和僅包含提交文字的修補程式。

組態設定

本節中此行以下的所有內容都是從 git-config[1] 文件中選擇性包含的。 內容與該處找到的相同

apply.ignoreWhitespace

當設定為 change 時,會告知 git apply 忽略空白中的變更,方式與 --ignore-space-change 選項相同。 當設定為以下其中一項時:no、none、never、false,它會告知 git apply 尊重所有空白差異。 請參閱 git-apply[1]

apply.whitespace

告知 git apply 如何處理空白,方式與 --whitespace 選項相同。 請參閱 git-apply[1]

子模組

如果修補程式包含對子模組的任何變更,則 git apply 會按如下方式處理這些變更。

如果指定了 --index (明確或隱含),則子模組的提交必須與索引完全匹配,才能套用修補程式。 如果任何子模組被檢出,則會完全忽略這些檢出,即它們不需要是最新的或乾淨的,並且不會更新。

如果未指定 --index,則會忽略修補程式中的子模組提交,並且僅檢查和(如果可能)更新相應子目錄的有無。

另請參閱

GIT

屬於 git[1] 套件的一部分

scroll-to-top