# 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