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

3

当我尝试使用git am应用补丁时,出现了以下错误:

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

补丁是使用git自己的format-patch命令创建的,没有进行任何编辑,这有什么问题吗?
2个回答

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

如果返回值为true,请尝试通过以下方式禁用该设置。
git config --global diff.noprefix false

如果您只想对当前库进行更改,可以省略--global标志。

之后生成的补丁对我来说正常运行。


很不幸,对我没有用。 - Daniel

1
但显然 Git 补丁依赖它们。
这应该不再是一个问题:
随着 Git 2.41(2023 年第二季度),"git format-patch"(man) 将遵循设置为非标准值的 src/dst 前缀的配置变量(如 diff.noprefix),导致期望标准 -p1 格式的补丁接收端中断。
教 "format-patch" 忽略最终用户配置并始终使用标准前缀。
这是一项向后不兼容的更改。
请查看 commit ab89575(2023年3月13日),以及 commit 8d5213dcommit c169af8commit b39a569commit 7c03d0dcommit 6799aad(2023年3月9日)由 Jeff King (peff) 提交。
(由 Junio C Hamano -- 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:添加 format.noprefix 选项

签名作者:Jeff King

上一个提交取消了在format-patch中对diff.noprefix的支持。 虽然这在大多数情况下都是正确的(在发送没有前缀的补丁是发送者更喜欢看到他们本地的补丁没有前缀的意外副作用时),但它没有为真正想要发送没有前缀的补丁的项目或工作流程留下好的选择。 你将被困在每次调用时使用“--no-prefix”。 因此,让我们添加一个特定于format-patch的配置选项,以启用此行为。 这为那些具有这种工作流程的人提供了一种获得所需内容的方法,但很难意外触发它。 进行过渡的更具向后兼容性的方法是在未设置时将format.noprefix默认为diff.noprefix。 但这并不能真正解决“意外”问题;人们必须手动设置format.noprefix=false。 而且,很少有人真正想要format.noprefix=true。 我在这里添加它主要是作为一个逃生口,而不是因为有人表达了任何兴趣。

git config现在在其手册页面中包含以下内容:

format.noprefix

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接