簡體中文 ▾ 主題 ▾ 最新版本 ▾ 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 倉庫中。

此命令應用補丁,但不會建立提交。使用 git-am[1]git-format-patch[1] 生成的或透過電子郵件接收的補丁建立提交。

選項

<補丁>…​

讀取補丁的檔案。可以使用 * -* 從標準輸入讀取。

--stat

不應用補丁,而是輸出輸入的 diff 統計。關閉“應用”功能。

--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,則嘗試三方合併,可能會在工作樹中的檔案中留下衝突標記供使用者解決。除非使用了 --cached 選項,否則此選項隱含 --index 選項,並且與 --reject 選項不相容。當與 --cached 選項一起使用時,所有衝突都保留在快取的更高階段。

--ours
--theirs
--union

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

--build-fake-ancestor=<檔案>

較新的 *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> 行周圍上下文匹配。如果周圍上下文行數少於 <n>,則所有行都必須匹配。預設情況下,不會忽略任何上下文。

--unidiff-zero

預設情況下,*git apply* 要求所應用的補丁是至少包含一行上下文的統一 diff。這提供了良好的安全措施,但在應用使用 --unified=0 生成的 diff 時會失效。要繞過這些檢查,請使用 --unidiff-zero

注意,由於上述原因,不鼓勵使用無上下文補丁。

--apply

如果您使用上面標記為“關閉 *apply*”的任何選項,*git apply* 將讀取並輸出所請求的資訊,而不會實際應用補丁。在這些標誌之後指定此標誌,以同時應用補丁。

--no-add

應用補丁時,忽略補丁所做的新增。這可以用於透過首先對兩個檔案執行 *diff*,然後使用此選項應用結果來提取兩個檔案之間的公共部分,這將應用刪除部分而非新增部分。

--allow-binary-replacement
--binary

歷史上,未經使用者明確許可,我們不允許應用二進位制補丁,此標誌是為此目的而設。目前,我們始終允許應用二進位制補丁,因此此標誌是空操作。

--exclude=<路徑模式>

不將更改應用於匹配給定路徑模式的檔案。這在匯入補丁集時很有用,當您想排除某些檔案或目錄時。

--include=<路徑模式>

將更改應用於匹配給定路徑模式的檔案。這在匯入補丁集時很有用,當您想包含某些檔案或目錄時。

當使用 --exclude--include 模式時,它們將按照在命令列中出現的順序進行檢查,並且第一個匹配項決定是否使用針對每個路徑的補丁。如果命令列上沒有包含模式,則預設使用不匹配任何包含/排除模式的路徑的補丁;如果存在任何包含模式,則忽略該補丁。

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

應用補丁時,如果需要,忽略上下文行中空白符的更改。上下文行將保留其空白符,並且無論 --whitespace 選項的值如何,它們都不會進行空白符修復。但是,新行仍將被修復。

--whitespace=<操作>

應用補丁時,檢測存在空白符錯誤的新行或修改行。哪些被認為是空白符錯誤由 core.whitespace 配置控制。預設情況下,行尾空白符(包括僅由空白符組成的行)以及行初始縮排中緊跟製表符的空格字元被視為空白符錯誤。

預設情況下,該命令會輸出警告訊息但應用補丁。當 git-apply 用於統計而不應用補丁時,它預設為 nowarn

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

  • nowarn 關閉尾隨空白符警告。

  • warn 為少數此類錯誤輸出警告,但原樣應用補丁(預設)。

  • fix 為少數此類錯誤輸出警告,並在修復後應用補丁(strip 是同義詞 — 該工具過去只將尾隨空白符視為錯誤,修復涉及 *刪除* 它們,但現代 Git 做了更多)。

  • error 為少數此類錯誤輸出警告,並拒絕應用補丁。

  • error-all 類似於 error,但顯示所有錯誤。

--inaccurate-eof

在某些情況下,某些版本的 *diff* 未能正確檢測檔案末尾缺失的新行。因此,由這些 *diff* 程式建立的補丁未能正確記錄不完整的行。此選項透過解決此錯誤來支援應用此類補丁。

-v
--verbose

向標準錯誤輸出報告進度。預設情況下,只打印當前正在應用的補丁的訊息。此選項將導致報告額外資訊。

-q
--quiet

抑制標準錯誤輸出。不會列印有關補丁狀態和進度的訊息。

--recount

不信任程式碼塊頭部中的行數,而是透過檢查補丁來推斷它們(例如,在編輯補丁後未適當調整程式碼塊頭部)。

--directory=<根目錄>

將 <根目錄> 前置到所有檔名。如果也傳遞了 "-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