# git-apply
> 原文: [https://git-scm.com/docs/git-apply](https://git-scm.com/docs/git-apply)
## 名稱
git-apply - 將補丁應用于文件和/或索引
## 概要
```
git apply [--stat] [--numstat] [--summary] [--check] [--index | --intent-to-add] [--3way]
[--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] [--unsafe-paths] [<patch>…?]
```
## 描述
讀取提供的diff輸出(即“補丁”)并將其應用于文件。從存儲庫中的子目錄運行時,將忽略目錄外的修補路徑。使用`--index`選項,補丁也會應用于索引,而使用`--cached`選項,補丁僅應用于索引。如果沒有這些選項,該命令僅將補丁應用于文件,并且不要求它們位于Git存儲庫中。
此命令應用修補程序但不創建提交。使用 [git-am [1]](https://git-scm.com/docs/git-am) 從 [git-format-patch [1]](https://git-scm.com/docs/git-format-patch) 生成的補丁創建提交和/或通過電子郵件接收。
## OPTIONS
```
<patch>…?
```
從中讀取補丁的文件。 _-_ 可用于從標準輸入讀取。
```
--stat
```
而不是應用補丁,輸入diffstat作為輸入。關閉“申請”。
```
--numstat
```
與`--stat`類似,但以十進制表示法顯示添加和刪除的行數,不使用縮寫表示路徑名,以使其更加機器友好。對于二進制文件,輸出兩個`-`而不是`0 0`。關閉“申請”。
```
--summary
```
而不是應用補丁,輸出從git diff擴展頭獲取的信息的精簡摘要,例如創建,重命名和模式更改。關閉“申請”。
```
--check
```
而不是應用修補程序,查看修補程序是否適用于當前工作樹和/或索引文件并檢測錯誤。關閉“申請”。
```
--index
```
當`--check`生效時,或者應用補丁時(默認情況下,如果沒有禁用它的選項生效),請確保補丁適用于當前索引文件記錄的內容。如果要在工作樹中修補的文件不是最新的,則會將其標記為錯誤。此標志還會導致更新索引文件。
```
--cached
```
在不觸及工作樹的情況下應用補丁。而是使用緩存數據,應用補丁,并將結果存儲在索引中,而不使用工作樹。這意味著`--index`。
```
--intent-to-add
```
僅將補丁應用于工作樹時,請稍后將新文件標記為添加到索引中(請參閱 [git-add [1]](https://git-scm.com/docs/git-add) 中的`--intent-to-add`選項)。除非在Git存儲庫中運行并且未指定`--index`,否則將忽略此選項。請注意,`--index`可能隱含在`--cached`或`--3way`等其他選項中。
```
-3
```
```
--3way
```
當補丁不能干凈地應用時,如果補丁記錄了應該應用的blob的身份,則回退到三向合并,并且我們在本地可以使用這些blob,可能會將沖突標記留在工作樹中的文件中供用戶解決。此選項隱含`--index`選項,與`--reject`和`--cached`選項不兼容。
```
--build-fake-ancestor=<file>
```
較新的 _git diff_ 輸出為每個blob嵌入了_索引信息_,以幫助識別該補丁適用的原始版本。給出此標志,并且如果Blob的原始版本在本地可用,則構建包含這些blob的臨時索引。
遇到純模式更改(沒有索引信息)時,將從當前索引讀取信息。
```
-R
```
```
--reverse
```
反向應用補丁。
```
--reject
```
對于原子性,默認情況下 _git apply_ 會使整個補丁失敗,并且當某些黑客不適用時不會觸及工作樹。此選項使其應用適用的修補程序部分,并將拒絕的數據保留在相應的* .rej文件中。
```
-z
```
當給出`--numstat`時,不要使用路徑名,而是使用NUL終止的機器可讀格式。
如果沒有此選項,則會引用具有“異常”字符的路徑名,如配置變量`core.quotePath`所述(參見 [git-config [1]](https://git-scm.com/docs/git-config) )。
```
-p<n>
```
刪除< n>傳統差異路徑的前導路徑組件(由斜線分隔)。例如,使用`-p2`,針對`a/dir/file`的補丁將直接應用于`file`。默認值為1。
```
-C<n>
```
確保至少< n>周圍環境的線在每次更改之前和之后匹配。當存在較少的周圍環境線時,它們都必須匹配。默認情況下,不會忽略任何上下文。
```
--unidiff-zero
```
默認情況下, _git apply_ 期望應用的補丁是具有至少一行上下文的統一差異。這提供了良好的安全措施,但在應用`--unified=0`生成的差異時會出現故障。要繞過這些檢查,請使用`--unidiff-zero`。
請注意,由于上述原因,不鼓勵使用無上下文補丁。
```
--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`配置控制。默認情況下,尾隨空格(包括僅由空格組成的行)和在行的初始縮進內緊跟著制表符的空格字符被視為空格錯誤。
默認情況下,該命令會輸出警告消息,但會應用修補程序。當`git-apply`用于統計而不應用補丁時,默認為`nowarn`。
您可以使用不同的`<action>`值來控制此行為:
* `nowarn`關閉尾隨空白警告。
* `warn`輸出一些此類錯誤的警告,但按原樣應用補丁(默認)。
* `fix`輸出一些此類錯誤的警告,并在修復它們之后應用補丁(`strip`是一個同義詞---用于考慮僅將空白字符作為錯誤尾隨的工具,并且修復涉及_剝離_他們,但現代Gits做得更多)。
* `error`輸出一些此類錯誤的警告,并拒絕應用補丁。
* `error-all`類似于`error`,但顯示所有錯誤。
```
--inaccurate-eof
```
在某些情況下, _diff_ 的某些版本無法在文件末尾正確檢測到丟失的換行符。因此,由 _diff_ 程序創建的補丁不能正確記錄不完整的行。此選項通過解決此錯誤添加了對應用此類修補程序的支持。
```
-v
```
```
--verbose
```
向stderr報告進度。默認情況下,僅打印有關當前正在應用的修補程序的消息。此選項將導致報告其他信息。
```
--recount
```
不要信任hunk標頭中的行數,而是通過檢查補丁來推斷它們(例如,在編輯補丁之后沒有適當地調整hunk標頭)。
```
--directory=<root>
```
前置< root>到所有文件名。如果還傳遞了“-p”參數,則在添加新根之前應用它。
例如,通過運行`git apply --directory=modules/git-gui`,可以將關于更新`a/git-gui.sh`到`b/git-gui.sh`的補丁應用于工作樹`modules/git-gui/git-gui.sh`中的文件。
```
--unsafe-paths
```
默認情況下,影響工作區域外的補丁(Git控制的工作樹或當“git apply”用作GNU補丁的替代時的當前工作目錄)被拒絕為錯誤(或惡作劇)。
當`git apply`用作“更好的GNU補丁”時,用戶可以通過`--unsafe-paths`選項來覆蓋此安全檢查。使用`--index`或`--cached`時,此選項無效。
## 組態
```
apply.ignoreWhitespace
```
如果要在默認情況下忽略空白更改,請設置為_更改_。如果您希望空格中的更改很重要,請設置為以下之一:no,none,never,false。
```
apply.whitespace
```
如果沒有從命令行給出`--whitespace`標志,則此配置項將用作默認值。
## 子模
如果補丁包含對子模塊的任何更改,則 _git apply_ 會按如下方式處理這些更改。
如果指定`--index`(顯式或隱式),則子模塊提交必須與要應用的修補程序的索引完全匹配。如果檢出任何子模塊,則完全忽略這些檢出,即,它們不需要是最新的或清潔的,并且它們不會被更新。
如果未指定`--index`,則忽略補丁中的子模塊提交,并且僅檢查相應子目錄的缺失或存在,并且(如果可能)更新。
## 也可以看看
[git-am [1]](https://git-scm.com/docs/git-am) 。
## GIT
部分 [git [1]](https://git-scm.com/docs/git) 套件
- git
- git-config
- git-help
- git-init
- git-clone
- git-add
- git-status
- git-diff
- git-commit
- git-reset
- git-rm
- git-mv
- git-branch
- git-checkout
- git-merge
- git-mergetool
- git-log
- git-stash
- git-tag
- git-worktree
- git-fetch
- git-pull
- git-push
- git-remote
- git-submodule
- git-show
- git-log
- git-shortlog
- git-describe
- git-apply
- git-cherry-pick
- git-rebase
- git-revert
- git-bisect
- git-blame
- git-grep
- gitattributes
- giteveryday
- gitglossary
- githooks
- gitignore
- gitmodules
- gitrevisions
- gittutorial
- gitworkflows
- git-am
- git-format-patch
- git-send-email
- git-request-pull
- git-svn
- git-fast-import
- git-clean
- git-gc
- git-fsck
- git-reflog
- git-filter-branch
- git-instaweb
- git-archive
- git-bundle
- git-daemon
- git-update-server-info
- git-cat-file
- git-check-ignore
- git-checkout-index
- git-commit-tree
- git-count-objects
- git-diff-index
- git-for-each-ref
- git-hash-object
- git-ls-files
- git-merge-base
- git-read-tree
- git-rev-list
- git-rev-parse
- git-show-ref
- git-symbolic-ref
- git-update-index
- git-update-ref
- git-verify-pack
- git-write-tree