Git应用跳过补丁
我正在尝试应用一个补丁,该补丁包含带有Git应用跳过补丁,git,patch,Git,Patch,我正在尝试应用一个补丁,该补丁包含带有git apply的二进制文件,但只添加了这些文件。我试着运行git apply failing.patch-v,它打印出如下内容: 跳过了修补程序“file.txt”。 正在检查修补程序文件.bin… 干净地应用了补丁文件.bin 我怎样才能找出跳过的原因?因为当前的消息不是很有启发性。我通过运行patch-p1
git apply
的二进制文件,但只添加了这些文件。我试着运行git apply failing.patch-v
,它打印出如下内容:
跳过了修补程序“file.txt”。正在检查修补程序文件.bin…
干净地应用了补丁文件.bin
我怎样才能找出跳过的原因?因为当前的消息不是很有启发性。我通过运行
patch-p1
找到了问题,它打印了:
在输入行5找不到要修补的文件
提醒我我不在根目录中
我不明白为什么冗长的消息不冗长
此外,甚至没有提到跳过和可能的原因。在尝试跨项目移植更改时遇到此问题
git apply
似乎会忽略修补程序文件路径上的任何目录名,如果索引行与目标存储库中的文件哈希不匹配,它也会拒绝应用。我最好能成功地使用这些选项(其中——没有索引似乎没有记录):
我也有同样的问题。在我的例子中,错误源是补丁目标的一些父目录中的.git
文件夹。解决方案是将补丁目标移到父目录之外。如果使用--directory选项“git apply”:
--目录=
该路径是相对于基本目录(包含“.git”的目录)的,,而不是相对于当前工作目录的。您也不能使用绝对路径
这完全没有文档记录,我花了几个小时才发现。我在这里根据其他答案提出了一个解决方案,但仍然需要做一些研究。这篇文章与其他文章相似,但填补了我在其他文章中遗漏的部分。希望它能为人们节省一些时间
在我的例子中,与源repo相比,目标repo中有一个额外的目录级别。换句话说,源回购中的顶级文件夹源顶级
,由目标回购中的父级目标顶级
包含。然而,由于没有错误,我不能确定这就是问题所在。所以我使用了--verbose
,它显示了错误,我可以确认这确实是问题所在
然后,我检查了git文档中的--directory
选项。它允许您指定一个字符串,该字符串将添加到修补程序中每个文件的路径之前:
--directory=<root>
Prepend <root> to all filenames.
--目录=
在所有文件名前加前缀。
通过指定--directory=target top-level
,它将每个路径源顶级/某些路径
转换为目标顶级/源顶级/某些路径
,从而使git apply
成功。当补丁包含的更改在过去已经应用时,通常会跳过补丁。有很多可能的原因:合并、樱桃采摘、手动操作的更改或使用另一个补丁等。我也考虑过这一点,但事实并非如此。我也有同样的问题。虽然是Drupal特有的,但原因可以应用于任何地方,也就是说,如果存在任何错误,git将不会应用修补程序,而patch命令以更零碎的方式工作。要添加到这一点,git存储库中的修补程序只能从repo的根目录中应用,因此执行“git apply-v myPatch.patch”在git存储库的子目录中,即使文件放置在repo不包含的任何其他目录中,该命令也会跳过该修补程序。另一种解决方法是从根目录调用“git apply-v path/to/myPatch.patch”,并确保补丁文件本身具有指向根目录文件的路径/to/fileToBePatched.file。我正在“忽略”文件夹中处理生成的项目。执行git init
允许应用修补程序。至少应该提供一个错误来指示找不到目录,但我看到的只是一个通用的“跳过的修补程序”错误(并且只有在启用详细日志记录时)。哦,哇,谢谢。这也是我的问题。我没有使用正确的相对路径。git对于正在发生的事情应该有更好的反馈。
--directory=<root>
--directory=<root>
Prepend <root> to all filenames.