Git套用会略过修复程序

ds97pgxw  于 2022-11-20  发布在  Git
关注(0)|答案(6)|浏览(130)

我尝试应用一个包含git apply二进制文件的补丁程序,但只添加了文件。我尝试运行git apply failing.patch -v,结果显示如下内容:
已跳过修补程序'file.txt'
正在检查修补文件. bin ...
干净地应用了补丁文件. bin。
我怎样才能找出跳过的原因呢?因为目前的信息不是很有启发性。

kupeojn6

kupeojn61#

我通过运行patch -p1 < failing.patch发现了这个问题,它显示:
在输入行5找不到要修补的文件
并提醒我不在根目录中。
我不明白为什么no one had asked this before和为什么详细消息不是详细的。
此外,即使是official documentation也没有提到跳过和可能的原因。

ddrv8njm

ddrv8njm2#

如果你使用--directory选项来“git apply”:

--directory=<root>

该路径是RELATIVE TO THE BASE DIRECTORY(包含.“git”的目录),而不是相对于当前工作目录。您也不能使用绝对路径。
这是完全没有记录的,我花了几个小时才发现。

dohp0rv5

dohp0rv53#

在尝试跨项目移植更改时遇到了这个问题。git apply似乎忽略了补丁文件路径上的任何目录名,如果索引行与目标库中的文件哈希不匹配,它也会拒绝应用。我最好使用以下选项(其中--no-index似乎没有文档记录):

git apply --verbose --no-index --directory {subdir} {patch-file}
h43kikqp

h43kikqp4#

遇到了同样的问题。在我的例子中,错误的来源是补丁目标的一些父目录中的.git文件夹。解决方案是将补丁目标移到该父目录之外。

csbfibhn

csbfibhn5#

我根据其他答案整理了一个解决方案,但仍需要做一些研究。这篇文章与其他文章相似,但填补了我从其他文章中遗漏的部分。希望它能为某人节省一些时间。
在我的例子中,与源存储库相比,目标存储库中有一个额外的目录级别。换句话说,源存储库中的顶级文件夹source-top-level包含在目标存储库中的父文件夹target-top-level中。但是,由于没有错误,我不能确定是不是这个问题。所以我使用--verbose,它显示了错误,我可以确认确实是这个问题。
然后我查看了git文档中的--directory选项,它允许你指定一个字符串,该字符串将被添加到补丁中每个文件的路径之前:

--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成功。

klsxnrf1

klsxnrf16#

请使用常规的patch命令。
我遇到这个问题是因为(可能我不应该)我的一个repo中有两个树,我试图对同一个repo中的另一个树应用diff。使用patch而不是git apply完成了我想要的:-)

相关问题