我正在尝试使用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-具体的.
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 路合并。
只是做了以下,并能够解决这个问题:
patch -p1 < example.patch
Run Code Online (Sandbox Code Playgroud)