Git
简体中文 ▾ Topics ▾ Latest version ▾ git-apply last updated in 2.44.0

名称

git-apply - Apply a patch to files and/or to the index

概述

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 | --quiet] [--unsafe-paths] [--allow-empty] [<patch>…​]

描述

Reads the supplied diff output (i.e. "a patch") and applies it to files. When running from a subdirectory in a repository, patched paths outside the directory are ignored. With the --index option, the patch is also applied to the index, and with the --cached option, the patch is only applied to the index. Without these options, the command applies the patch only to files, and does not require them to be in a Git repository.

该命令会应用补丁,但不会创建提交。 使用 git-am[1]git-format-patch[1] 生成的和/或通过电子邮件收到的补丁创建提交。

选项

<patch>…​

要读取补丁的文件。 - 可以用来从标准输入中读取。

--stat

不应用补丁,而是输出输入的差异状态。 关掉 "apply"。

--numstat

类似于 --stat,但是用十进制符号显示增加和删除的行数,路径名不加缩写,使其对机器更友好。 对于二进制文件,输出两个`-` 而不是 0 0。 关闭 "apply"。

--summary

Instead of applying the patch, output a condensed summary of information obtained from git diff extended headers, such as creations, renames, and mode changes. Turns off "apply".

--check

看看该补丁是否适用于当前工作树和/或索引文件,并检测到错误,而不是应用该补丁。 关闭 "apply"。

--index

在索引和工作目录上都打上补丁(如果 --check`生 效,则只需检查它是否能干净地应用于两者)。注意,--index` 希望相关路径的索引条目和工作区副本是相同的(它们的内容和元数据,如文件模式必须匹配),如果它们不相同,将引发一个错误,即使该补丁可以干净地应用于索引和工作区。

--cached

将补丁只应用于索引,而不触及工作目录。如果 --check 是有效的,只需检查它是否能干净地应用于索引条目。

--intent-to-add

当只在工作树上应用补丁时,标记新的文件,以便以后添加到索引中(见 git-add[1] 中的 --intent-to-add 选项)。除非在 Git 仓库中运行且没有指定 --index,否则该选项将被忽略。 请注意,--index 可能是由其他选项暗示的,如 --cached--3way

-3
--3way

如果补丁记录了它应该应用到的二进制文件的身份,并且我们有这些二进制文件在本地可用,则尝试三方合并,可能会在工作树中的文件中留下冲突标记,由用户解决。 这个选项意味着 --index 选项,除非使用 --cached 选项,并且与 --reject 选项不兼容。 当与 --cached 选项一起使用时,任何冲突都被留在缓存的较高阶段。

--build-fake-ancestor=<file>

较新的 "git diff" 输出为每个 blob 嵌入了 "索引信息",以帮助识别补丁所适用的原始版本。 当给出这个标志时,如果 blob 的原始版本在本地可用,则建立一个包含这些 blob 的临时索引。

当遇到一个纯粹的模式变化(没有索引信息)时,将从当前索引中读取信息。

-R
--reverse

反过来应用补丁。

--reject

为了保证原子性,git apply 默认情况下会使整个补丁失效,并且在某些目标不适用的情况下不会接触工作区。 这个选项让它应用补丁中适用的部分,并将被拒绝的目标留在相应的 *.rej 文件中。

-z

--numstat 被给出时,不对路径名进行编码,而是使用以 NUL 结尾的机器可读格式。

Without this option, pathnames with "unusual" characters are quoted as explained for the configuration variable core.quotePath (see git-config[1]).

-p<n>

Remove <n> leading path components (separated by slashes) from traditional diff paths. E.g., with -p2, a patch against a/dir/file will be applied directly to file. The default is 1.

-C<n>

确保每次更改前后至少有 <n> 行的周围环境相匹配。 当周围环境的行数较少时,它们必须全部匹配。 在默认情况下,没有任何上下文被忽略。

--unidiff-zero

默认情况下,git apply 希望被应用的补丁是一个至少有一行上下文的统一差异。 这提供了很好的安全措施,但在应用以 --unified=0 生成的差异时,会出现问题。要绕过这些检查,请使用 --unidiff-zero

Note, for the reasons stated above, the usage of context-free patches is discouraged.

--apply

如果您使用了上面标有 "关闭 apply " 的任何选项,git apply 会读取并输出所需的信息,而不会实际应用补丁。 在这些标志之后给出这个标志,也可以应用该补丁。

--no-add

当应用一个补丁时,忽略该补丁所做的添加内容。 这可以用来提取两个文件之间的共同部分,首先对它们运行 diff,然后用这个选项应用结果,这将应用删除的部分,但不应用增加的部分。

--allow-binary-replacement
--binary

Historically we did not allow binary patch application without an explicit permission from the user, and this flag was the way to do so. Currently, we always allow binary patch application, so this is a no-op.

--exclude=<path-pattern>

不要对符合给定路径模式的文件进行修改。这在导入补丁集时,你想把某些文件或目录排除在外的情况下很有用。

--include=<path-pattern>

将修改应用于与给定路径模式相匹配的文件。这在导入补丁集时,你想包括某些文件或目录的情况下很有用。

当使用 --exclude--include 模式时,会按照它们在命令行中出现的顺序进行检查,第一个匹配项决定是否使用每个路径的补丁。 如果命令行上没有include模式,则默认使用不匹配任何 include/exclude 模式的路径的补丁,如果有任何 include 模式,则忽略。

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

当应用一个补丁时,如果有必要,请忽略上下文行中的空白变化。 上下文行将保留其空白,无论 --whitespace 选项的值是多少,它们都不会进行空白修正。不过,新的行仍然会被修复。

--whitespace=<action>

当应用一个补丁时,检测一个新的或修改过的行有空格错误。 什么是空格错误是由 core.whitespace 配置控制的。 默认情况下,尾部的空白(包括仅由空白组成的行)和紧跟在行的初始缩进内的 Tab 字符的空白字符被认为是空白错误。

默认情况下,该命令输出警告信息,但会应用补丁。 当 git-apply 被用于统计而不应用补丁时,它默认为 nowarn

You can use different <action> values to control this behavior:

  • nowarn 关闭尾部空白警告。

  • warn 对少数此类错误输出警告,但按原样应用补丁(默认)。

  • fix 对一些这样的错误输出警告,并在修复后应用补丁(strip 是一个同义词—​该工具过去只考虑尾部空白字符的错误,修复涉及 stripping 等,但现代 Gits 做得更多)。

  • error 对几个这样的错误输出警告,并拒绝应用补丁。

  • error-allerror 类似,但显示所有错误。

--inaccurate-eof

在某些情况下,某些版本的 diff ' 不能正确检测到文件末尾缺少的换行。因此,由这类 'diff 程序创建的补丁不能正确记录不完整的行。这个选项通过解决这个错误来增加对应用这种补丁的支持。

-v
--verbose

向标准错误流报告进度。默认情况下,只有关于当前正在应用的补丁的信息会被打印出来。这个选项将导致报告额外的信息。

-q
--quiet

抑制标准错误流输出。关于补丁状态和进度的信息将不被打印。

--recount

不信任组头中的行数,而是通过检查补丁来推断(例如,在编辑补丁后没有适当调整组头)。

--directory=<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 补丁" 时,用户可以通过 --unsafe-paths 选项来覆盖这个安全检查。 当使用 --index--cached 时,该选项没有作用。

--allow-empty

Don’t return an error for patches containing no diff. This includes empty patches and patches with commit text only.

配置

Warning

Missing zh_HANS-CN/includes/cmd-config-section-all.txt

See original version for this content.

Warning

Missing zh_HANS-CN/config/apply.txt

See original version for this content.

子模块

如果该补丁包含对子模块的任何修改,那么 git apply 会对这些修改进行如下处理。

如果 --index 被指定(显式或隐式),那么子模块的提交必须与索引完全匹配,补丁才能应用。 如果任何一个子模块被检出,那么这些检出的模块将被完全忽略,也就是说,它们不需要是最新的或干净的,它们也不会被更新。

如果没有指定 --index,那么补丁中的子模块提交将被忽略,只检查相应的子目录是否存在,并(如果可能)更新。

参见

GIT

属于 git[1] 文档

scroll-to-top