Git:无法应用补丁-缺少头信息

mzsu5hc0  于 2023-04-28  发布在  Git
关注(0)|答案(2)|浏览(225)

我在尝试使用git am应用补丁时遇到了这个错误:

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

补丁是用git自己的format-patch命令创建的,没有任何编辑,有什么问题吗?

nkkqxpd9

nkkqxpd91#

原来是因为我在git diff输出中禁用了文件名前缀(.gitconfig中的noprefix = true)。它们在阅读git diff输出时没有用,但显然git补丁依赖于它们。
你可以检查你的设置是什么

git config --get diff.noprefix

如果返回true,请尝试使用

git config --global diff.noprefix false

(you如果你只想对当前的repo进行修改,可以省略--global标志)。
之后生成的补丁对我来说工作得很好。

gwo2fgha

gwo2fgha2#

但显然git补丁依赖于它们。
它不再是一个问题:
在Git 2.41(2023年第2季度)中,“git format-patch”(man)使用配置变量(如diff.noprefix)将src/dst前缀设置为非标准值,导致希望标准-p1的补丁接收端中断。
教“format-patch“忽略最终用户配置并始终使用标准前缀。
这是破坏向后兼容性的更改。
参见commit ab89575(2023年3月13日)和commit 8d5213dcommit c169af8commit b39a569commit 7c03d0dcommit 6799aad(2023年3月9日)by Jeff King ( peff )
(由Junio C Hamano -- gitster --合并于commit 15108de,2023年3月21日)

format-patch:不尊重diff.noprefix

签字人:杰夫·金
format-patch的输出遵循diff.noprefix,但这通常会给接收补丁的人带来麻烦,因为他们必须手动指定“-p0”才能应用它。
我不认为有任何具体的意图,它的行为方式。
nopprefix选项由git_diff_ui_config()处理,format-patch存在于管道和瓷器之间的灰色区域。
人们确实会查看输出,我们希望它对事物进行着色,尊重他们对算法的选择,等等。
但是这个特殊的选项给接收方带来了问题(理论上diff.mnemonicprefix也是如此,但是因为我们总是格式化提交,所以助记符前缀总是“a/”和“b/”)。
那我们就把它关掉吧。
轻微的缺点是:

  • 设置了diff.noprefix的人大概喜欢看到没有前缀的补丁。

如果他们使用format-patch来查看他们的系列,他们将看到前缀。
另一方面,让他们看看实际上会发送什么可能是一个好主意。
我们可以尝试在这里用“is stdout a tty”来玩游戏,就像我们对颜色所做的那样。
但这不是一个完全可靠的信号,可能不值得麻烦。如果你想看到的补丁与通常的花里胡哨,那么你最好使用“git log”或“git show”。

  • 如果项目确实有一个喜欢无前缀补丁的工作流,并且接收方准备使用“-p0”,那么发送方现在必须为每个格式化补丁调用手动说出“--no-prefix”。

这看起来并不太可怕,因为接收方必须手动为每个git-amman)调用说“-p0”。
并且:

format-patch:添加格式。无前缀选项

签字人:杰夫·金
上一次提交在format-patch中放弃了对diff.noprefix的支持。
虽然这在大多数情况下会做正确的事情(发送不带前缀的补丁是发送者更喜欢查看不带前缀的本地补丁的一个偶然的副作用),但对于确实希望发送不带前缀的补丁的项目或工作流来说,这并没有留下好的选择。
您将被困在每次调用都使用“--no-prefix”。
因此,让我们添加一个特定于format-patch的配置选项来启用此行为。
这为拥有这样一个工作流程的人提供了一种获得他们想要的东西的方法,但很难意外触发它。
一种更向后兼容的转换方法是使用格式。noprefix默认为diff。noprefix当它没有设置。
但这并不能真正解决“意外”问题;人们必须手动设置format.noprefix=false
而且一开始就不太可能有人真的想要format.noprefix=true
我在这里添加它主要是作为一个逃生舱门,并不是因为任何人对它表示了任何兴趣。
git config现在在其手册页中包括:

format.noprefix

如果设置,则不在修补程序中显示任何源或目标前缀。这相当于git diff使用的diff.noprefix选项(但format-patch不遵守)。请注意,通过设置此选项,您生成的任何补丁的接收方都必须使用-p0选项应用它们。

相关问题