Git
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。关闭“应用”。

--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 可用,则尝试进行 3 路合并,可能会在工作树中的文件中留下冲突标记供用户解决。此选项暗示--index选项,除非使用--cached选项,并且与--reject选项不兼容。当与--cached选项一起使用时,任何冲突都保留在缓存中的较高阶段。

--ours
--theirs
--union

不将冲突留在文件中,而是偏向我们的(或他们的或两者的)行来解决冲突。需要 --3way。

--build-fake-ancestor=<file>

较新的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> 行周围的上下文。当存在较少的周围上下文行时,它们都必须匹配。默认情况下,从不忽略任何上下文。

--unidiff-zero

默认情况下,git apply期望应用的补丁是至少有一行上下文的统一 diff。这提供了良好的安全措施,但在应用使用--unified=0生成的 diff 时会失效。要绕过这些检查,请使用--unidiff-zero

请注意,出于上述原因,不鼓励使用无上下文补丁。

--apply

如果您使用了上面标记为“关闭应用”的任何选项,则git apply会读取并输出请求的信息,而不会实际应用补丁。在这些标志之后给出此标志以应用补丁。

--no-add

应用补丁时,忽略补丁做出的添加。这可用于提取两个文件之间的公共部分,方法是首先对它们运行diff,然后使用此选项应用结果,这将应用删除部分但不应用添加部分。

--allow-binary-replacement
--binary

历史上,我们不允许在没有用户明确许可的情况下应用二进制补丁,此标志正是用于实现此目的。目前,我们始终允许应用二进制补丁,因此此选项已无作用。

--exclude=<path-pattern>

不将更改应用于与给定路径模式匹配的文件。在导入补丁集时,如果要排除某些文件或目录,此选项很有用。

--include=<path-pattern>

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

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

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

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

--whitespace=<action>

应用补丁时,检测具有空白字符错误的新行或修改行。core.whitespace配置控制哪些内容被视为空白字符错误。默认情况下,尾随空白字符(包括仅由空白字符组成的行)以及初始缩进内紧跟制表符的空格字符都被视为空白字符错误。

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

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

  • nowarn关闭尾随空白字符警告。

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

  • fix输出一些此类错误的警告,并在修复这些错误后应用补丁(strip是同义词——该工具用于仅将尾随空白字符视为错误,修复涉及去除它们,但现代Git会执行更多操作)。

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

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

--inaccurate-eof

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

-v
--verbose

将进度报告到stderr。默认情况下,只会打印有关当前正在应用的补丁的消息。此选项将导致报告其他信息。

-q
--quiet

抑制stderr输出。不会打印有关补丁状态和进度的消息。

--recount

不信任块头中的行数,而是通过检查补丁来推断它们(例如,在编辑补丁但没有相应调整块头后)。

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