当我尝试使用git am
应用补丁时,出现了以下错误:
error: git diff header lacks filename information
when removing 1 leading pathname component (line 9)
补丁是使用git自己的
format-patch
命令创建的,没有进行任何编辑,这有什么问题吗?git config --get diff.noprefix
true
,请尝试通过以下方式禁用该设置。git config --global diff.noprefix false
如果您只想对当前库进行更改,可以省略--global
标志。
之后生成的补丁对我来说正常运行。
git format-patch
"(man) 将遵循设置为非标准值的 src/dst
前缀的配置变量(如 diff.noprefix
),导致期望标准 -p1
格式的补丁接收端中断。format-patch
" 忽略最终用户配置并始终使用标准前缀。peff
) 提交。gitster
-- 合并于 commit 15108de,2023年3月21日)
format-patch
:不尊重diff.noprefix
署名:Jeff King
format-patch的输出遵循diff.noprefix,但这通常会给接收补丁的人带来麻烦,因为他们必须手动指定“-p0”才能应用它。我认为没有任何特定意图让它以这种方式运行。noprefix选项由git_diff_ui_config()处理,而format-patch存在于plumbing和porcelain之间的灰色地带。人们确实会查看输出,我们期望它可以着色,尊重他们选择的算法等等。但是这个特定选项会给接收者带来问题(理论上,diff.mnemonicprefix也会有问题,但由于我们总是格式化提交,助记前缀将始终为“a/”和“b/”)。所以让我们禁用它。轻微的缺点是:设置diff.noprefix的人可能希望看到没有前缀的补丁。如果他们使用format-patch来审查他们的系列,则会看到前缀。另一方面,对于他们来说,查看实际发送的内容可能是一个好主意。我们可以在这里玩游戏,比如我们为颜色所做的那样,“stdout是否为tty”。但那不是完全可靠的信号,而且可能不值得麻烦。如果您想看到带有通常的花哨效果的补丁,则最好使用“git log”或“git show”。如果一个项目确实有喜欢无前缀补丁的工作流程,并且接收者准备使用“-p0”,那么发送者现在必须为每个format-patch调用手动说“--no-prefix”。鉴于接收者必须为每个git-am调用手动说“-p0”,这似乎不是太可怕。且:
上一个提交取消了在format-patch中对diff.noprefix的支持。 虽然这在大多数情况下都是正确的(在发送没有前缀的补丁是发送者更喜欢看到他们本地的补丁没有前缀的意外副作用时),但它没有为真正想要发送没有前缀的补丁的项目或工作流程留下好的选择。 你将被困在每次调用时使用“--no-prefix”。 因此,让我们添加一个特定于format-patch的配置选项,以启用此行为。 这为那些具有这种工作流程的人提供了一种获得所需内容的方法,但很难意外触发它。 进行过渡的更具向后兼容性的方法是在未设置时将format.noprefix默认为diff.noprefix。 但这并不能真正解决“意外”问题;人们必须手动设置format.noprefix=false。 而且,很少有人真正想要format.noprefix=true。 我在这里添加它主要是作为一个逃生口,而不是因为有人表达了任何兴趣。
format-patch
:添加 format.noprefix 选项签名作者:Jeff King
git config
现在在其手册页面中包含以下内容:
format.noprefix
如果设置了此选项,则不会在补丁中显示任何源或目标前缀。这相当于
git diff
使用的diff.noprefix
选项(但format-patch
不支持该选项)。请注意,通过设置此选项,您生成的任何补丁的接收者都必须使用-p0
选项来应用它们。