执行git apply时出现错误“删除1个前导路径名组件时git diff头缺少文件名信息“

sulc1iza  于 2022-12-17  发布在  Git
关注(0)|答案(5)|浏览(347)

我用一个命令创建了一个diff文件:
git--无分页程序差异--无索引--统计信息路径A路径B〉\diff. log
接下来,我执行了一个命令:
git apply--索引--忽略空格更改--忽略空白\diff.log
在执行过程中,我遇到了一个错误:
错误:git diff头缺少文件名信息,当删除1个前导路径名组件时(第2138行)
第2138行通向:
2136 diff命令--git a/C:\临时文件\右键文件
2137新建文件模式100644
2138指数00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2139差分--git ......
我尝试了一个命令"git apply--reject ...",但它也不起作用。我还添加了忽略chmod更改的config(git config core. fileMode false),但什么也没有改变。

guz6ccqo

guz6ccqo1#

很可能是因为你在git config(~/.gitconfg)中有这样的设置:

[diff]
  noprefix = true

字符串
因此,您可以删除它或将其更改为false:
git config --global diff.noprefix false

thtygnil

thtygnil2#

你可以试试这个。

修补程序-p0〈文件名

这个补丁命令读取源文件中关于如何修改文件的指令,然后应用修改。源文件包含差异列表(或diff列表)和一个或多个diff命令输出集,称为块。
patch命令跳过补丁文件中的任何前导文本,应用实际的diff列表,并跳过任何尾随文本。因此,您可以将用作包含diff列表的补丁文件或消息,并且patch命令仍将工作。在这种情况下,如果整个diff列表缩进一致的量,则patch命令也将调整该间距。

  • p0不修改整个路径名。
5rgfhyps

5rgfhyps3#

这种行为可能是由于不同的文件名。git apply无法推断是否涉及重命名并拒绝修补程序。
如果要应用二进制修补程序**,则两个文件名**必须相同。
以下格式的修补程序应该可以工作:

diff --git a/a_path/binary_file.img b/a_path/binary_file.img
index …
GIT binary patch
delta …
…data…

这可能会失败:

diff --git a/a_path/binary_file.img b/a_path/renamed_binary_file.img
index …
GIT binary patch
delta …
…data…

所以,如果你使用的是git diff --no-index,你必须手动修改补丁中的文件名,只有这样git apply才知道你的补丁是什么。
另请参见Linus Torvalds的评论:
顺便说一句,我认为这已经不再是一个bug了。不可能知道用户是否希望这个补丁是一个重命名。因此,因为你不知道你应该使用什么名字而拒绝应用它可能是 * 完全 * 正确的事情!

lfapxunr

lfapxunr4#

确保当前工作目录正确。

w6mmgewl

w6mmgewl5#

我得到了

error: git diff header lacks filename information when removing 1 leading pathname component (line 5)

在下面的补丁上,使用svn diff --git(svn,版本1.14.1(r1886195)运行在Debian上)生成,我尝试使用git apply(git版本2.30.2运行在Debian上):

Index: essai/essai.txt
===================================================================
diff --git a/essai/essai.txt b/essai/essai.txt
new file mode 100644

这个补丁所做的是创建一个新的空文件,名为essai/essai.txt
问题是在Windows下svn添加了一个以diff --git行结尾的CRLF行,这会在git中造成麻烦。
尝试使用Linux,或者向git或svn提交补丁,或者破解svn diff --git生成的补丁。

相关问题