我在尝试使用git am应用补丁时遇到了这个错误:
git am
error: git diff header lacks filename information when removing 1 leading pathname component (line 9)
补丁是用git自己的format-patch命令创建的,没有任何编辑,有什么问题吗?
format-patch
nkkqxpd91#
原来是因为我在git diff输出中禁用了文件名前缀(.gitconfig中的noprefix = true)。它们在阅读git diff输出时没有用,但显然git补丁依赖于它们。你可以检查你的设置是什么
.gitconfig
noprefix = true
git diff
git config --get diff.noprefix
如果返回true,请尝试使用
true
git config --global diff.noprefix false
(you如果你只想对当前的repo进行修改,可以省略--global标志)。之后生成的补丁对我来说工作得很好。
--global
gwo2fgha2#
但显然git补丁依赖于它们。它不再是一个问题:在Git 2.41(2023年第2季度)中,“git format-patch”(man)使用配置变量(如diff.noprefix)将src/dst前缀设置为非标准值,导致希望标准-p1的补丁接收端中断。教“format-patch“忽略最终用户配置并始终使用标准前缀。这是破坏向后兼容性的更改。参见commit ab89575(2023年3月13日)和commit 8d5213d、commit c169af8、commit b39a569、commit 7c03d0d、commit 6799aad(2023年3月9日)by Jeff King ( peff )。(由Junio C Hamano -- gitster --合并于commit 15108de,2023年3月21日)
git format-patch
diff.noprefix
src/dst
-p1
peff
gitster
签字人:杰夫·金format-patch的输出遵循diff.noprefix,但这通常会给接收补丁的人带来麻烦,因为他们必须手动指定“-p0”才能应用它。我不认为有任何具体的意图,它的行为方式。nopprefix选项由git_diff_ui_config()处理,format-patch存在于管道和瓷器之间的灰色区域。人们确实会查看输出,我们希望它对事物进行着色,尊重他们对算法的选择,等等。但是这个特殊的选项给接收方带来了问题(理论上diff.mnemonicprefix也是如此,但是因为我们总是格式化提交,所以助记符前缀总是“a/”和“b/”)。那我们就把它关掉吧。轻微的缺点是:
-p0
git_diff_ui_config()
diff.mnemonicprefix
a/
b/
如果他们使用format-patch来查看他们的系列,他们将看到前缀。另一方面,让他们看看实际上会发送什么可能是一个好主意。我们可以尝试在这里用“is stdout a tty”来玩游戏,就像我们对颜色所做的那样。但这不是一个完全可靠的信号,可能不值得麻烦。如果你想看到的补丁与通常的花里胡哨,那么你最好使用“git log”或“git show”。
git log
git show
--no-prefix
这看起来并不太可怕,因为接收方必须手动为每个git-am(man)调用说“-p0”。并且:
git-am
签字人:杰夫·金上一次提交在format-patch中放弃了对diff.noprefix的支持。虽然这在大多数情况下会做正确的事情(发送不带前缀的补丁是发送者更喜欢查看不带前缀的本地补丁的一个偶然的副作用),但对于确实希望发送不带前缀的补丁的项目或工作流来说,这并没有留下好的选择。您将被困在每次调用都使用“--no-prefix”。因此,让我们添加一个特定于format-patch的配置选项来启用此行为。这为拥有这样一个工作流程的人提供了一种获得他们想要的东西的方法,但很难意外触发它。一种更向后兼容的转换方法是使用格式。noprefix默认为diff。noprefix当它没有设置。但这并不能真正解决“意外”问题;人们必须手动设置format.noprefix=false。而且一开始就不太可能有人真的想要format.noprefix=true。我在这里添加它主要是作为一个逃生舱门,并不是因为任何人对它表示了任何兴趣。git config现在在其手册页中包括:
format.noprefix=false
format.noprefix=true
git config
format.noprefix
如果设置,则不在修补程序中显示任何源或目标前缀。这相当于git diff使用的diff.noprefix选项(但format-patch不遵守)。请注意,通过设置此选项,您生成的任何补丁的接收方都必须使用-p0选项应用它们。
2条答案
按热度按时间nkkqxpd91#
原来是因为我在git diff输出中禁用了文件名前缀(
.gitconfig
中的noprefix = true
)。它们在阅读git diff
输出时没有用,但显然git补丁依赖于它们。你可以检查你的设置是什么
如果返回
true
,请尝试使用(you如果你只想对当前的repo进行修改,可以省略
--global
标志)。之后生成的补丁对我来说工作得很好。
gwo2fgha2#
但显然git补丁依赖于它们。
它不再是一个问题:
在Git 2.41(2023年第2季度)中,“
git format-patch
”(man)使用配置变量(如diff.noprefix
)将src/dst
前缀设置为非标准值,导致希望标准-p1
的补丁接收端中断。教“
format-patch
“忽略最终用户配置并始终使用标准前缀。这是破坏向后兼容性的更改。
参见commit ab89575(2023年3月13日)和commit 8d5213d、commit c169af8、commit b39a569、commit 7c03d0d、commit 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-am
(man)调用说“-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
选项应用它们。