git:修补程序不适用
我有一个叫做my_pcc_branch.patch的补丁 当我尝试应用它时,会收到以下消息:git:修补程序不适用,git,msysgit,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/jav
$ 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
这是什么意思
如何解决此问题?当您混合使用UNIX和Windows git客户端时会发生这种情况,因为Windows实际上没有“x”位的概念,所以您在Windows下签出的
rw-r--r--
(0644)文件由msys POSIX层“升级”为rwx-r-xr-x
(0755)。git认为模式差异与文件中的文本差异基本相同,因此您的补丁程序不会直接应用。我认为您唯一的好选择是将core.filemode
设置为false
(使用git-config
)
这里有一个msysgit问题和一些相关信息:(改为archive.org 2013年12月3日的副本)Johannes Sixtmsysgit@googlegroups.com邮件列表建议使用以下命令行参数:
git apply --ignore-space-change --ignore-whitespace mychanges.patch
这解决了我的问题。git apply--reject--whitespace=fix mychanges.patch适合我
解释
--reject
选项将指示git在无法确定如何应用修补程序时不要失败,而是应用它可以应用的单个块,并为它无法应用的块创建拒绝文件(.rej
)。可以“应用[这些]被拒绝的补丁并执行逐字差异”
此外,--whitespace=fix
将警告空格错误并尝试修复它们,而不是拒绝应用其他适用的hunk
这两个选项结合在一起使修补程序的应用对故障更具鲁棒性,但它们需要额外注意结果
有关整个文档,请参阅。此命令将应用修补程序,但不会解析它,并将坏文件保留为
*。rej
:
git apply --reject --whitespace=fix mypath.patch
你只需要解决它们。解决后,运行:
git -am resolved
当所有其他方法都失败时,尝试一下
git apply--3way patchFile.patch
--3路当修补程序没有干净地应用时,如果 补丁记录了它应该应用到的blob的身份,我们 让这些斑点在当地可用,可能会导致冲突 工作树中文件中供用户解析的标记。这 选项表示--index选项,并且与 --拒绝和--cached选项
典型的失败案例尽可能多地应用补丁程序,并让您在git中解决冲突,而您通常是这样做的。可能比拒绝更容易一步。在我的情况下,我愚蠢到一开始就错误地创建了补丁文件,实际上以错误的方式进行了区分。我最终得到了完全相同的错误消息 如果您在master上并执行
git diff branch name>branch name.patch
,则会尝试删除所有希望添加的内容,反之亦然(这对于git来说是不可能完成的,因为显然,从未完成的添加内容无法删除)
因此,请确保您签出到您的分支并执行分支名称。请尝试使用此处建议的解决方案:
patch-p1
这对我很有帮助。警告:此命令可以永久删除旧的丢失提交。尝试此操作之前,请复制整个存储库。
我找到了
我不知道为什么这样做有效,但我尝试了很多解决方法,这是唯一对我有效的方法。简而言之,运行以下三个命令:
git fsck --full
git reflog expire --expire=now --all
git gc --prune=now
我所寻找的并不是在这里明确指出的,所以,我写这篇文章是为了其他可能寻找类似信息的人。我面临一个问题,一个文件(在旧回购协议中存在)在回购协议中被删除。当我应用补丁时,它失败了,因为它找不到要应用的文件。(所以我的情况是git补丁无法删除文件)
“#git apply--reject”肯定给出了一个观点,但并没有让我完全了解问题所在。我不能使用wiggle,因为它在我们的构建服务器中不可用。在我的例子中,我通过从我尝试应用的补丁文件中删除“在回购中被删除的文件”的条目解决了这个问题,因此我在没有问题的情况下应用了所有其他更改(使用3向合并,避免空白错误),然后手动将删除文件的内容合并到其移动的位置。我的问题是,我运行了
git diff
,然后运行了git reset--hard HEAD
,然后意识到我想要撤销,所以我尝试将git diff
的输出复制到一个文件中,并使用git apply
,但我遇到了一个错误,即“补丁不适用”。在切换到patch
并尝试使用它之后,我意识到由于某种原因重复了一大块diff,在删除了重复的之后,patch
(大概也是git apply
)起了作用。git apply--reverse--reject example.patch
创建分支名称反转的修补程序文件时:
例如,如果仅应用了部分修补程序,而不是整个修补程序,则使用“
git diff-feature\u branch..master”
代替“git diff-master..feature\u branch”
”。请确保应用修补程序时您位于正确的目录中
例如,我在父项目文件夹中创建了一个补丁文件,其中包含
.git
文件。但是,我尝试在较低级别应用补丁。它仅在该项目级别应用更改。我尝试运行命令“git config core.filemode false”,但它没有帮助-我仍然收到相同的消息。假设您的树中没有未提交的更改,请尝试git reset--hard HEAD
强制git使用有效的新选项重新签出您的文件。只需尝试执行“git reset--hard HEAD”。它是成功的(我看到消息“HEAD现在在…”),但是“git apply”的问题仍然存在