git:补丁不适用

时间:2011-01-22 19:54:26

标签: 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

这是什么意思?

如何解决此问题?

13 个答案:

答案 0 :(得分:277)

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

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

这解决了我的问题。

答案 1 :(得分:222)

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

答案 2 :(得分:46)

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

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

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

git -am resolved

答案 3 :(得分:41)

当其他所有方法都失败时,请尝试git apply's --3way option

git apply --3way patchFile.patch

  

- 3WAY
  如果补丁不能完全应用,请退回3路合并   补丁记录了它应该适用的blob的身份,我们   让这些blob在本地可用,可能会留下冲突   工作树中文件中的标记供用户解析。这个   选项意味着--index选项,并且与...不兼容   --reject和--cached options。

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

答案 4 :(得分:13)

当您混合使用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日副本)

答案 5 :(得分:10)

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

patch -p1 < example.patch

这帮助了我。

答案 6 :(得分:2)

在我的情况下,我愚蠢到首先错误地创建补丁文件,实际上以错误的方式区分。我最终得到了完全相同的错误消息。

如果你是主人并做git diff branch-name > branch-name.patch,这会尝试删除你想要发生的所有添加,反之亦然(git无法完成,因为很明显,从未完成添加无法删除)。

因此,请务必检查您的分行并执行git diff master > branch-name.patch

答案 7 :(得分:1)

我找到了this link

我不知道为什么会这样,但我尝试了很多工作,这是唯一适合我的工作。简而言之,运行以下三个命令:

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

答案 8 :(得分:1)

git apply --reverse --reject example.patch

在创建具有相反分支名称的补丁文件时:

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

答案 9 :(得分:0)

我的问题是我先运行git diff,然后运行git reset --hard HEAD,然后才意识到我想撤消操作,所以我尝试将git diff的输出复制到文件中并使用{{1 }},但出现错误“补丁不适用”。切换到git apply并尝试使用它后,我意识到由于某种原因重复了一部分差异,并且删除了重复的之后,patch(大概也是patch)起作用。

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:-1)

我在这里未完全指出我所寻找的内容,我是为了其他可能会搜索相似内容的人而写。我遇到了一个问题(存在于旧仓库中),该文件已从仓库中删除。当我应用补丁程序时,由于找不到要应用的文件,补丁程序将失败。 (所以我的情况是git patch无法删除文件) '#git apply --reject'确实给出了一个观点,但并没有完全解决我的问题。我不能使用摆动,因为它在构建服务器中不可用。就我而言,我通过从尝试应用的补丁文件中删除了“已从存储库中删除的文件”的条目来解决了这个问题,因此我应用了所有其他更改而没有出现问题(使用三向合并,避免了空格错误),然后手动将已删除文件的内容合并到其移动位置。