【问题标题】:git: patch does not applygit:补丁不适用
【发布时间】:2011-06-13 19:11:51
【问题描述】:

我有一个名为 my_pcc_branch.patch 的补丁。

当我尝试应用它时,我收到以下消息:

$ git apply --check my_pcc_branch.patch
warning: src/main/java/.../AbstractedPanel.java has type 100644, expected 100755
error: patch failed: src/main/java/.../AbstractedPanel.java:13
error: src/main/java/.../AbstractedPanel.java: patch does not apply

什么意思?

我该如何解决这个问题?

【问题讨论】:

  • 周围是否有 AbstractedPanel.java.rej 文件?这通常意味着在源代码和补丁中都发生了更改(此处第 13 行似乎受到了影响)。
  • 不,我没有找到任何 *.rej 文件。
  • 不确定为什么接受的答案会解决它(所以我怀疑这是一个红鲱鱼),但has type 100644, expected 100755 不是暗示某处存在 chmod 权限不匹配吗?
  • 您是否尝试向 git@vger.kernel.org 报告错误? Git 的描述选项都不适用于我返回大量错误。我不得不退回到 WinMerge。

标签: git msysgit


【解决方案1】:

git apply --reject --whitespace=fix mychanges.patch 为我工作。

说明

--reject 选项将指示 git 在无法确定如何应用补丁时不会失败,而是应用它可以应用的单个块并为它不能应用的块创建拒绝文件 (.rej)。 Wiggle 可以“应用 [这些] 被拒绝的补丁并执行逐字比较”。

此外,--whitespace=fix 将警告空白错误并尝试修复它们,而不是拒绝应用其他适用的大块。

这两个选项一起使补丁的应用更加健壮以防止失败,但它们需要额外注意结果。

有关整个文档,请参阅https://git-scm.com/docs/git-apply

【讨论】:

  • 这实际上对我来说效果更好,因为它没有完全修改我的文件
  • 这很棒。只是拒绝它自己无法解决的问题,然后您可以手动修改被拒绝的文件。
  • patch -p1 .orig 和 .rej 补丁,您可以手动应用更改。我猜 git apply --reject 也一样,而且 --whitespace=fix 神奇地更好。
  • 此命令在无法自动检测如何应用补丁时创建.rej 文件。您可以使用wiggle 来解决此类问题。
  • 这个答案没有解释任何东西,特别是在什么情况下它会起作用。伙计们,您真的必须对答案质量提出更高的要求,这不是论坛。
【解决方案2】:

msysgit@googlegroups.com 邮件列表中的 Johannes Sixt 建议使用以下命令行参数:

git apply --ignore-space-change --ignore-whitespace mychanges.patch

这解决了我的问题。

【讨论】:

  • 谁能帮我解释一下为什么会这样?另一个答案对我不起作用,我遇到的问题与提问者描述的完全相同。文件属性与忽略空格有什么关系?
  • 使用windows powershell 用git diff 制作的补丁成功应用如下: git diff HEAD..613fee -- myfile.xml | git apply --ignore-space-change --ignore-whitespace,而首先将差异输出保存为文件不起作用,以防万一有人遇到同样的问题
  • 也可以尝试-C1 切换应用,它会减少被认为重要的添加的上下文。
  • @EricWalker,带有 CR/LF 的 git 魔法不一定是坏事。另一种方法是,您的一半变更集由每个文件中的每一行组成,这些文件中的每一行都从一行结束更改为另一行,而实际更改隐藏在中间的某个地方。
  • 这有时会有所帮助。但其他时候,我仍然得到“补丁不适用”,即使补丁应该没有问题地应用。
【解决方案3】:

当一切都失败时,尝试git apply's --3way option

git apply --3way patchFile.patch

--3way
当补丁不能干净地应用时,如果 patch 记录了它应该应用到的 blob 的身份,我们 让这些 blob 在本地可用,可能会导致冲突 工作树中文件中的标记供用户解析。这 选项意味着 --index 选项,并且与 --reject 和 --cached 选项。

典型的失败案例会尽可能多地应用补丁,并让您在 git 中解决冲突,但您通常会这样做。可能比 reject 替代方案简单一步。

【讨论】:

  • 这是对我有用的答案。我正在修补的文件没有反映我从中生成补丁的更改(因为我在创建补丁后删除了更改。)
  • 不错的通用解决方案。 3way 差异看起来不像通常那样,所以有点困惑,但这让我有能力解决冲突并应用补丁。
  • 我认为这个--3way 应该是默认行为。当修补失败时,至少告诉我失败的原因,以便我可以手动修复它。 git apply 只是失败并且没有报告失败的原因。我什至找不到像hg 生成的*.rej 文件。
  • 绝对是最好的解决方案。让用户自己解决冲突!
  • 在问题是由空格差异引起的情况下对我不起作用。我从来没有得到提示,--3way 实际上并没有应用任何东西。 error: patch failed: Foo.cs:4 Falling back to three-way merge... error: patch failed: Foo.cs:4 error: Foo.cs: patch does not apply然而,在同一个补丁文件上,如果我忽略空格,它将适用(然后我必须修复空格)。
【解决方案4】:

此命令将应用未解决的补丁,将错误文件保留为*.rej

git apply --reject --whitespace=fix mypath.patch

你只需要解决它们。一旦解决运行:

git -am resolved

【讨论】:

  • 如何解决*.rej - 我能找到的只是在源文件中手动进行更改并删除这些.rej 文件。还有什么办法吗?
  • @coding_idiot 像往常一样,只需检查 .rej 文件,将它们与冲突文件进行比较,最后将固定文件添加到索引中(使用“git add FIXED_FILES”)
  • @coding_idiot 你可以使用wiggle 来解决它。例如:wiggle --replace path/to/file path/to/file.rej。此命令会将 .rej 文件的更改应用到原始文件。它还会创建原始文件的副本,例如path/to/file.porig。请查看文档以获取有关 wiggle 的更多信息
【解决方案5】:

尝试使用此处建议的解决方案:https://www.drupal.org/node/1129120

patch -p1 < example.patch

这对我有帮助。

【讨论】:

  • 我知道你不应该这样做,但非常感谢你!节省了我几个小时。我收到“补丁不适用”和各种错误。
  • @sudorm-rfslash,为什么我们不应该这样做,你为什么还要这样做?
  • git: 'patch' is not a git command. on git version 2.21.1 (Apple Git-122.3)
  • @SridharSarnobat 命令是patch,而不是git patch。见patch(1)
【解决方案6】:

当您混合 UNIX 和 Windows git 客户端时会发生这种情况,因为 Windows 并没有真正具有“x”位的概念,因此您在 Windows 下对 rw-r--r-- (0644) 文件的检出由 msys POSIX “提升”层为rwx-r-xr-x (0755)。 git 认为模式差异与文件中的文本差异基本相同,因此您的补丁不直接适用。我认为您在这里唯一的好选择是将core.filemode 设置为false(使用git-config)。

这是一个带有一些相关信息的 msysgit 问题:http://code.google.com/p/msysgit/issues/detail?id=164(重新路由到 archive.org 的 2013 年 12 月 3 日副本)

【讨论】:

  • 我尝试运行命令“git config core.filemode false”,但没有帮助 - 我仍然收到相同的消息。
  • 假设您的树中没有未提交的更改,请尝试git reset --hard HEAD 强制 git 使用新选项重新签出您的文件。
  • 刚试过执行“git reset --hard HEAD”。它是成功的(我看到消息“HEAD is now at ...”),但“git apply”的问题仍然存在。
【解决方案7】:

就我而言,我一开始就错误地创建了补丁文件,实际上是区分错误的方式。我最终得到了完全相同的错误消息。

如果您在 master 上并执行 git diff branch-name > branch-name.patch,这会尝试删除您想要发生的所有添加,反之亦然(这对于 git 来说是不可能完成的,因为显然,从未完成的添加无法被删除)。

所以请确保您结帐到您的分支并执行git diff master > branch-name.patch

【讨论】:

【解决方案8】:

git apply --reverse --reject example.patch

当您创建一个分支名称颠倒的补丁文件时:

即。 git diff feature_branch..master 而不是 git diff master..feature_branch

【讨论】:

    【解决方案9】:

    警告:此命令可以永久删除丢失的旧提交。在尝试此操作之前复制整个存储库。

    我找到了this link

    我不知道为什么会这样,但我尝试了很多解决方法,这是唯一对我有用的方法。简而言之,运行以下三个命令:

    git fsck --full
    git reflog expire --expire=now --all
    git gc --prune=now
    

    【讨论】:

    • 这是一个非常危险的命令,它可以从 reflog 中永久删除丢失的旧提交。如果您的回购处于不稳定状态,请不要应用它。
    【解决方案10】:

    只要使用git apply -v example.patch就可以知道“补丁不适用”的原因。然后你就可以一一修复了。

    【讨论】:

      【解决方案11】:

      我的问题是我跑了git diff,然后跑了git reset --hard HEAD,然后意识到我想撤消,所以我尝试将git diff的输出复制到一个文件中并使用git apply,但我得到了一个错误那个“补丁不适用”。在切换到patch 并尝试使用它后,我意识到由于某种原因重复了一部分差异,并且在删除重复项后patch(可能还有git apply)工作。

      【讨论】:

      • @VirendraKumar 我手动编辑了差异文件以删除重复的行。然后我使用了patch。 (git apply 可能也可以。)
      【解决方案12】:

      如果仅部分应用补丁,而不是整个补丁。确保您在应用补丁时位于正确的目录中。

      例如,我在包含.git 文件的父项目文件夹中创建了一个补丁文件。但是我试图在较低级别应用补丁。它只是在项目的那个级别应用更改。

      【讨论】:

        【解决方案13】:

        以防万一,当我尝试应用的更改已存在于文件中时,我发现这发生在我身上。

        【讨论】:

          【解决方案14】:

          我在这里寻找的内容并没有在 SO 中准确指出,我写这篇文章是为了其他可能搜索类似内容的人的利益。我遇到了一个文件(存在于旧仓库中)在仓库中被删除的问题。当我应用补丁时,它会失败,因为它找不到要应用的文件。 (所以我的情况是 git patch 因为文件被删除而失败) '#git apply --reject' 确实给出了一个观点,但并没有让我完全解决问题。我不能使用 wiggle,因为它在我们的构建服务器中不可用。就我而言,我通过从我尝试应用的补丁文件中删除“在 repo 中删除的文件”的条目解决了这个问题,所以我应用了所有其他更改而没有问题(使用 3 路合并,避免空白错误),然后手动将删除的文件内容合并到移动的位置。

          【讨论】:

            猜你喜欢
            • 2015-05-21
            • 2014-11-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-29
            • 1970-01-01
            相关资源
            最近更新 更多