git:补丁不适用

DP_*_*DP_ 244 git msysgit

我有一个名为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
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

我该如何解决这个问题?

DP_*_*DP_ 294

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

git apply --ignore-space-change --ignore-whitespace mychanges.patch
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题.

  • 任何人都可以帮助我解释为什么这有效吗?另一个答案对我不起作用,我和问题提供者描述的问题完全相同.文件属性与忽略空格有什么关系? (24认同)
  • 也尝试`-C1`开关申请,它减少了被视为重要的添加的背景. (2认同)
  • @ EricWalker,CR / LF的git magic不一定是一件坏事。另一种选择是,更改集的一半由每个被触摸的文件中的每一行组成,从一行到另一行更改,而实际更改则埋在中间。 (2认同)
  • 这有时有帮助.但其他时候,我仍然得到"补丁不适用",即使补丁应该没有问题. (2认同)

小智 257

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

  • 这个答案没有解释任何事情,特别是在哪些情况下它会起作用.人们,你真的必须要求更高的答案质量,这不是一个论坛. (12认同)
  • 这实际上对我来说效果更好,因为它没有完全修改我的文件 (6认同)
  • 这很棒.只是拒绝它无法解决的问题,然后您可以手动修改被拒绝的文件. (6认同)
  • 接受的答案对我不起作用; 这样做了. (6认同)
  • 当无法自动检测如何应用补丁时,此命令会创建`.rej`文件.您可以使用[wiggle](http://linux.die.net/man/1/wiggle)来解决此类问题. (6认同)
  • 接下来是 `wiggle --replace file file.rej` 并解决文件中剩余的冲突(在漂亮的 IDE 支持的帮助下)解决了所有问题。非常感谢,让我很高兴:祈祷: (2认同)

ruf*_*fin 76

当一切都失败了,尝试git apply--3way选项.

git apply --3way patchFile.patch

--3way
当补丁不能干净地应用时,如果补丁记录了它应该应用的blob的身份,则回退到三向合并,并且我们在本地可以使用这些blob,可能会在文件中保留冲突标记用户要解决的工作树.此选项隐含--index选项,与--reject和--cached选项不兼容.

典型的失败案例尽可能多地应用补丁,并且在git中通过git解决冲突,但通常会这样做.可能比reject替代方案更容易一步.

  • 我认为`--3way`应该是默认行为.当修补失败时,至少告诉我失败的原因,以便我可以手动修复它.'git apply`刚刚失败,并没有报告为什么出现问题.我甚至找不到像`hg`生成的`*.rej`文件. (6认同)
  • 如果问题是由空格差异引起的,则对我不起作用。我从来没有得到提示,并且 `--3way` 实际上没有应用任何东西。```错误:补丁失败:Foo.cs:4 回退到三向合并...错误:补丁失败:Foo.cs:4 错误:Foo.cs:补丁不适用```但是,在相同的补丁文件,如果我忽略空格,它将适用(然后我必须去修复空格)。 (3认同)
  • `--3way` 比 `--reject` 好得多,因为你最终会遇到每个 git 开发人员都用来解决的正常合并冲突。 (3认同)
  • 这个答案对我有用.我正在修补的文件没有反映我生成修补程序的更改(因为我在创建修补程序后删除了更改.) (2认同)
  • 不错的一般解 3way差异看起来并不像通常那样有点混淆但是从来没有这样能让我有能力解决冲突并获得应用补丁. (2认同)
  • 绝对是最好的解决方案。让用户解决自己的矛盾! (2认同)

Iva*_*lin 53

此命令将应用不解析它的补丁,将坏文件保留为*.rej:

git apply --reject --whitespace=fix mypath.patch
Run Code Online (Sandbox Code Playgroud)

你只需解决它们.解决后运行:

git -am resolved
Run Code Online (Sandbox Code Playgroud)

  • 如何解决`*.rej` - 我能找到的就是在源文件中手动进行更改并删除这些`.rej`文件.还有其他方法吗? (7认同)
  • @coding_idiot您可以使用[wiggle](http://linux.die.net/man/1/wiggle)来解决它.例如:`wiggle --replace path/to/file path/to/file.rej`.此命令将从`.rej`文件更改为原始文件.它还会创建原始文件的副本,例如`path/to/file.porig`.请结帐文档以获取有关wiggle的更多信息 (2认同)

Ben*_*son 16

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

这是一个msysgit问题,其中包含一些相关信息:http://code.google.com/p/msysgit/issues/detail? id = 164 (重新发送到archive.org的2013年12月3日副本)

  • 我试图运行命令"git config core.filemode false",但它没有帮助 - 我仍然得到相同的消息. (2认同)

Pin*_*yni 16

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

patch -p1 < example.patch

这对我有帮助.

  • 我知道您不应该这样做,但是非常感谢!节省了我几个小时。我收到“补丁不适用”和各种错误。 (3认同)
  • @SridharSarnobat 该命令是`patch`,而不是`git patch`。请参阅[patch(1)](https://man7.org/linux/man-pages/man1/patch.1.html) (3认同)
  • 就是这样。忘记`git补丁` (2认同)

sec*_*ree 14

只需使用即可git apply -v example.patch了解“补丁不适用”的原因。然后你就可以一一修复它们。


chi*_*rai 6

git apply --reverse --reject example.patch

当您创建分支名称相反的补丁文件时:

IE。git diff feature_branch..master代替git diff master..feature_branch


Oph*_*ian 5

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

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

因此,请确保您签出您的分支并执行 git diff master > branch-name.patch