9

我通过命令创建了一个差异文件:

git --no-pager diff --no-index --stat pathA pathB >\diff.log

接下来,我执行了一个命令:

git apply --index --ignore-space-change --ignore-whitespace \diff.log

在执行过程中我遇到了一个错误:

错误:删除 1 个前导路径名组件时,git diff 标头缺少文件名信息(第 2138 行)

第 2138 行导致:

第2136章

2137 新文件模式 100644

2138 索引 0000000000000000000000000000000000000000..e69de...

第2139章

我尝试了一个命令“git apply --reject ...”,但它也没有用。我还添加了忽略 chmod 更改的配置(git config core.fileMode false)并且没有任何更改。

4

3 回答 3

9

git config很可能是因为您在(~/.gitconfg)中有此设置:

[diff]
  noprefix = true

因此,您可以将其删除或更改为 false:

git config --global diff.noprefix false

于 2019-08-03T17:31:34.807 回答
1

你可以试试这个。

补丁 -p0 < 文件名

此补丁命令读取源文件关于如何更改文件的说明,然后应用更改。源文件包含差异列表(或差异列表)和一组或多组 diff 命令输出,例如称为 hunks。

patch 命令跳过补丁文件中的任何前导文本,应用实际的差异列表,并跳过任何尾随文本。因此,您可以将其用作包含差异列表的补丁文件或消息,并且补丁命令仍然有效。在这种情况下,如果整个 diff 列表的缩进量一致,patch 命令也将针对该间距进行调整。

  • p0 保持整个路径名不变。
于 2021-09-22T05:02:45.520 回答
0

这种行为可能是由于不同的文件名。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 的评论

顺便说一句,我认为这不再是一个错误。不可能知道用户是否打算对补丁进行重命名。因此,因为您不知道应该使用什么名称而拒绝应用它可能 是正确的做法!

于 2021-08-06T16:18:14.377 回答