使用"git am -3"应用补丁时收到错误消息"'致命:sha1信息缺乏或无用"

mic*_*ael 26 git

我正在尝试使用git am -3"补丁路径"将一系列补丁从1 git存储库应用到另一个git存储库.我按顺序应用它们,从补丁1-4,它工作正常.

但是当我来到第5个补丁时,我得到的错误是"致命:sha1信息缺乏或无用".我去了应用补丁的git存储库,我确实看到了'dev/afile'文件.所以我想知道为什么git抱怨"sha1信息缺乏或无用(dev/afile.c)",我该如何解决我的问题?

 $ git am -3 ~/Tmp/mypatches/0005-fifth.patch
Applying: rpmsg: Allow devices to use custom buffer allocator
fatal: sha1 information is lacking or useless (dev/afile.c).
Repository lacks necessary blobs to fall back on 3-way merge.
Cannot fall back to three-way merge.
Patch failed at 0001 first patch
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".
Run Code Online (Sandbox Code Playgroud)

为什么它说"补丁在0001第一个补丁失败",当我做"git am -3~/Tmp/mypatches/0005-fifth.patch"时,它完成没有错误.

谢谢.

Kor*_*nel 10

开头的补丁文件0001-无法干净地应用 - 存在一些冲突.

Git希望通过查看此修补程序所基于的提交来解决该冲突,但是您的存储库中没有这些提交.

可能是修补程序是从一个从未共享过提交的分支创建的,或者您或提交者的分支已经被重新设置.

0005-可以应用补丁而没有错误并不重要.错误是0001-具体的.

  • 这应该是一个评论. (5认同)

Rus*_*lop 10

我在尝试将一个存储库中的补丁应用到一个历史无关的存储库中时遇到了这个问题(同一个项目,但具有重建的 git 历史记录)。您收到该消息的原因fatal: sha1 information is lacking or useless (dev/afile.c)是,当 git 尝试进行 3 路合并时,它需要访问该文件的状态。这些文件由格式补丁输出中的哈希值指向(例如)

diff --git a/dev/afile.c b/dev/afile.c
index ebbd50fc0b7..ef1ca87ead0 100644
--- a/dev/afile.c
+++ b/dev/afile.c
Run Code Online (Sandbox Code Playgroud)

ebbd50fc0b7 和 ef1ca87ead0 指的是文件内容的哈希值,而不是提交哈希值。

如果你试试:

git cat-file blob <hash from patch>
Run Code Online (Sandbox Code Playgroud)

Git 会报告:

fatal: Not a valid object name <hash from patch>
Run Code Online (Sandbox Code Playgroud)

Git 找不到它们,因为这些版本的文件在您的本地存储库中不可用(因此出现消息Repository lacks necessary blobs to fall back on 3-way merge.)。您可以通过以下方式使这些对象在本地存储库中可用:

git remote add old_repo <url>
git fetch old_repo
Run Code Online (Sandbox Code Playgroud)

现在,当你运行时:

git cat-file blob <hash from patch>
Run Code Online (Sandbox Code Playgroud)

你应该得到那个文件的内容。现在git am再次尝试您的命令,它应该能够进行 3 路合并。


小智 9

你在项目中使用子模块吗?

git 1.7.12到1.8.1.2中存在一个错误,其中更新的子模块会导致rebase(或补丁)失败并显示错误消息:

致命:sha1信息缺乏或无用

如果应用,则将提交留空.

更多信息在这里.

将git更新到版本1.8.4解决了这个问题


Pin*_*yni 8

只是做了以下,并能够解决这个问题:

patch -p1 < example.patch
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说与 `git apply` 的效果相同。`patch` 和 `git apply` 都可以在工作树中创建差异,但 `git am` 输出 sha1 错误。我想使用 `git am` 来保存提交消息。 (4认同)
  • 我发现将 git format-patch 输出传送到 `patch -p1 --merge`,手动修复问题,然后 `git add .` 和 `git am --continue` 最适合我。 (4认同)