Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git应用跳过补丁_Git_Patch - Fatal编程技术网

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.