我尝试应用一个包含git apply二进制文件的补丁程序,但只添加了文件。我尝试运行git apply failing.patch -v,结果显示如下内容:已跳过修补程序'file.txt'正在检查修补文件. bin ...干净地应用了补丁文件. bin。我怎样才能找出跳过的原因呢?因为目前的信息不是很有启发性。
git apply
git apply failing.patch -v
kupeojn61#
我通过运行patch -p1 < failing.patch发现了这个问题,它显示:在输入行5找不到要修补的文件并提醒我不在根目录中。我不明白为什么no one had asked this before和为什么详细消息不是详细的。此外,即使是official documentation也没有提到跳过和可能的原因。
patch -p1 < failing.patch
ddrv8njm2#
如果你使用--directory选项来“git apply”:
--directory=<root>
该路径是RELATIVE TO THE BASE DIRECTORY(包含.“git”的目录),而不是相对于当前工作目录。您也不能使用绝对路径。这是完全没有记录的,我花了几个小时才发现。
dohp0rv53#
在尝试跨项目移植更改时遇到了这个问题。git apply似乎忽略了补丁文件路径上的任何目录名,如果索引行与目标库中的文件哈希不匹配,它也会拒绝应用。我最好使用以下选项(其中--no-index似乎没有文档记录):
--no-index
git apply --verbose --no-index --directory {subdir} {patch-file}
h43kikqp4#
遇到了同样的问题。在我的例子中,错误的来源是补丁目标的一些父目录中的.git文件夹。解决方案是将补丁目标移到该父目录之外。
.git
csbfibhn5#
我根据其他答案整理了一个解决方案,但仍需要做一些研究。这篇文章与其他文章相似,但填补了我从其他文章中遗漏的部分。希望它能为某人节省一些时间。在我的例子中,与源存储库相比,目标存储库中有一个额外的目录级别。换句话说,源存储库中的顶级文件夹source-top-level包含在目标存储库中的父文件夹target-top-level中。但是,由于没有错误,我不能确定是不是这个问题。所以我使用--verbose,它显示了错误,我可以确认确实是这个问题。然后我查看了git文档中的--directory选项,它允许你指定一个字符串,该字符串将被添加到补丁中每个文件的路径之前:
source-top-level
target-top-level
--verbose
--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成功。
--directory=target-top-level
source-top-level/some-path
target-top-level/source-top-level/some-path
klsxnrf16#
请使用常规的patch命令。我遇到这个问题是因为(可能我不应该)我的一个repo中有两个树,我试图对同一个repo中的另一个树应用diff。使用patch而不是git apply完成了我想要的:-)
patch
6条答案
按热度按时间kupeojn61#
我通过运行
patch -p1 < failing.patch
发现了这个问题,它显示:在输入行5找不到要修补的文件
并提醒我不在根目录中。
我不明白为什么no one had asked this before和为什么详细消息不是详细的。
此外,即使是official documentation也没有提到跳过和可能的原因。
ddrv8njm2#
如果你使用--directory选项来“git apply”:
该路径是RELATIVE TO THE BASE DIRECTORY(包含.“git”的目录),而不是相对于当前工作目录。您也不能使用绝对路径。
这是完全没有记录的,我花了几个小时才发现。
dohp0rv53#
在尝试跨项目移植更改时遇到了这个问题。
git apply
似乎忽略了补丁文件路径上的任何目录名,如果索引行与目标库中的文件哈希不匹配,它也会拒绝应用。我最好使用以下选项(其中--no-index
似乎没有文档记录):h43kikqp4#
遇到了同样的问题。在我的例子中,错误的来源是补丁目标的一些父目录中的
.git
文件夹。解决方案是将补丁目标移到该父目录之外。csbfibhn5#
我根据其他答案整理了一个解决方案,但仍需要做一些研究。这篇文章与其他文章相似,但填补了我从其他文章中遗漏的部分。希望它能为某人节省一些时间。
在我的例子中,与源存储库相比,目标存储库中有一个额外的目录级别。换句话说,源存储库中的顶级文件夹
source-top-level
包含在目标存储库中的父文件夹target-top-level
中。但是,由于没有错误,我不能确定是不是这个问题。所以我使用--verbose
,它显示了错误,我可以确认确实是这个问题。然后我查看了git文档中的
--directory
选项,它允许你指定一个字符串,该字符串将被添加到补丁中每个文件的路径之前:通过指定
--directory=target-top-level
,它将每个路径source-top-level/some-path
转换为target-top-level/source-top-level/some-path
,并且git apply
成功。klsxnrf16#
请使用常规的
patch
命令。我遇到这个问题是因为(可能我不应该)我的一个repo中有两个树,我试图对同一个repo中的另一个树应用diff。使用
patch
而不是git apply
完成了我想要的:-)