Git: patch不适用

我有一个叫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

这是什么意思?

我该如何解决这个问题?

378653 次浏览

当你混合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日的副本)

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

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

这解决了我的问题。

git apply --reject --whitespace=fix mychanges.patch对我有用。

解释

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

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

这两个选项一起可以使补丁应用程序在失败时更加健壮,但是它们需要额外关注结果。

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

这个命令将应用补丁不解决它留下坏文件为*.rej:

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

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

git -am resolved

当所有这些都失败时,尝试__ABC0的--3way选项

git apply --3way patchFile.patch

< br > < p >——3 如果补丁没有完全应用,则返回到3向合并 Patch记录了它应该应用到的blob的身份,而我们 这些斑点是否在本地可用,可能会离开冲突 工作树中供用户解析的文件中的标记。这 选项暗示了——index选项,并且与 ——reject和——cached选项

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

在我的情况下,我愚蠢到在第一个地方错误地创建补丁文件,实际上是用错误的方法求导。我最终得到了完全相同的错误消息。

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

所以请确保签出到分支并执行git diff master > branch-name.patch

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

patch -p1 < example.patch

这对我很有帮助。

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

我找到了这个链接

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

git fsck --full
git reflog expire --expire=now --all
git gc --prune=now
我所寻找的东西并没有在这里明确指出,我是为了其他人的利益而写的,他们可能会寻找类似的东西。我遇到了一个问题,一个文件(存在于旧的回购)在回购中被删除。当我应用补丁时,它失败了,因为它找不到要应用的文件。(所以我的情况是git补丁失败的文件被删除) “#git apply -reject”肯定给出了一个视图,但并没有让我解决问题。我不能使用wiggle,因为它在我们的构建服务器中是不可用的。在我的情况下,我通过从补丁文件中删除“在repo中删除的文件”的条目来解决这个问题,所以我得到了所有其他更改,没有问题(使用3种方式合并,避免空白错误),然后手动合并文件删除的内容到它移动的地方

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

git apply --reverse --reject example.patch

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

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

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

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

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

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