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 仓库中。

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

选项

<patch>…​

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

--stat

代替应用补丁,输出输入的 diffstat。关闭 "apply"。

--numstat

类似于 --stat,但是以十进制表示法显示添加和删除的行数,以及没有缩写的路径名,使其更易于机器读取。对于二进制文件,输出两个 -,而不是说 0 0。关闭 "apply"。

--summary

代替应用补丁,输出从 git diff 扩展头获得的信息的简明摘要,例如创建、重命名和模式更改。关闭 "apply"。

--check

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

--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

为了原子性,默认情况下,当某些 hunk 不适用时,git apply 会使整个补丁失败,并且不会触及工作树。此选项使其应用适用的补丁部分,并将拒绝的 hunk 留在相应的 *.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=<路径模式>

将更改应用于与给定路径模式匹配的文件。这在导入补丁集时很有用,可以包含某些文件或目录。

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

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

应用补丁时,如果需要,忽略上下文行中的空格更改。上下文行将保留其空格,并且无论 --whitespace 选项的值如何,它们都不会进行空格修复。但是,新行仍然会被修复。

--whitespace=<动作>

应用补丁时,检测是否有新的或修改的行具有空格错误。什么是空格错误由 core.whitespace 配置控制。 默认情况下,尾随空格(包括仅由空格组成的行)和紧跟在行初始缩进中的制表符空格被认为是空格错误。

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

您可以使用不同的 <动作> 值来控制此行为

  • nowarn 关闭尾随空格警告。

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

  • fix 为一些此类错误输出警告,并在修复后应用补丁(strip 是同义词 — 该工具过去只将尾随空格字符视为错误,并且修复涉及 *stripping* 它们,但现代 Git 会做更多的事情)。

  • error 为一些此类错误输出警告,并拒绝应用补丁。

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

--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

不要为包含无差异的补丁返回错误。这包括空补丁和仅包含提交文本的补丁。

配置

本节中此行下的所有内容均从 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