我尝试应用包含git apply
二进制文件的修补程序,但只添加了文件。我尝试运行git apply failing.patch -v
并打印出类似的内容:
跳过补丁' file.txt'。
检查补丁文件.bin ...
干净地应用补丁文件。
如何找出跳过原因的原因?由于目前的信息不是很有启发性。
答案 0 :(得分:17)
我通过运行打印的patch -p1 < failing.patch
找到了问题:
无法在输入第5行找到要修补的文件
并提醒我,我不在根目录中。
我无法理解为什么no one had asked this before以及为什么详细信息不详细。
此外,甚至official documentation都没有提及跳过和可能的原因。
答案 1 :(得分:4)
如果使用--directory选项来“ git apply”:
--directory=<root>
该路径与基本目录(包含“ .git”的目录)相关,而不是相对于当前工作目录。您也不能使用绝对路径。
这是完全没有记载的,花了我几个小时才发现。
答案 2 :(得分:3)
尝试在项目之间移植更改时遇到此问题。 git apply
似乎忽略了修补程序文件路径上的任何目录名称,如果索引行与目标存储库中的文件哈希不匹配,它也会拒绝应用。我使用这些选项取得了更大的成功(其中--no-index
似乎没有记录):
git apply --verbose --no-index --directory {subdir} {patch-file}
答案 3 :(得分:1)
我根据此处的其他答案整理了一个解决方案,但仍需进行一些研究。这篇文章与其他文章相似,但填补了我在其他文章中遗漏的部分。希望它可以为某人节省一些时间。
就我而言,与源存储库相比,目标存储库中有一个额外的目录级别。换言之,源存储库中的顶级文件夹 source-top-level
包含在目标存储库中的父级 target-top-level
中。但是,由于没有错误,我无法确定这是问题所在。所以我使用了 --verbose
,它显示了错误,我可以确认确实是问题所在。
然后我检查了 --directory
选项的 git 文档。它允许您指定一个字符串,该字符串将附加到补丁中每个文件的路径:
--directory=<root>
Prepend <root> to all filenames.
通过指定 --directory=target-top-level
,它将每个路径 source-top-level/some-path
转换为 target-top-level/source-top-level/some-path
,这样 git apply
就成功了。
答案 4 :(得分:0)
遇到同样的问题。在我的情况下,错误源是补丁目标的某些父目录中的.git
文件夹。解决方案是将补丁目标移到父目录之外。