Git 获取错误消息'';致命:sha1信息缺失或无用”;当应用补丁时,使用;吉特am-3“号;

Git 获取错误消息'';致命:sha1信息缺失或无用”;当应用补丁时,使用;吉特am-3“号;,git,Git,我正在尝试使用GitAM-3“补丁路径”将一系列补丁从一个git存储库应用到另一个git存储库。我按顺序应用它们,从补丁1-4开始,效果很好 但是当我来到第五个补丁时,我得到一个错误,说“致命:sha1信息缺失或无用”。我去了git存储库,在那里我应用了补丁,我确实看到了文件“dev/afile”。 所以我想知道为什么git抱怨“sha1信息缺失或无用(dev/afile.c)”,我该如何解决我的问题 $ git am -3 ~/Tmp/mypatches/0005-fifth.patch A

我正在尝试使用GitAM-3“补丁路径”将一系列补丁从一个git存储库应用到另一个git存储库。我按顺序应用它们,从补丁1-4开始,效果很好

但是当我来到第五个补丁时,我得到一个错误,说“致命: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".
为什么它会说“第一个补丁在0001时失败”,当我执行“git am-3~/Tmp/mypatches/0005-fifth.Patch”时,它会毫无错误地完成


谢谢。

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

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

可能该修补程序是从具有从未共享的提交的分支创建的,或者您或提交者的分支已重新设置了基础


补丁
0005-
可以毫无错误地应用并不重要。错误具体是关于
0001-

您是否在项目中使用子模块

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

致命:sha1信息缺失或无用

如果应用,则保留提交为空

更多信息


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

当我试图在错误的分支上创建补丁时遇到了这个问题

我认为“git format patch…”能够确定我想要什么,因为您可以在format patch调用中指定主分支和要修补的分支。我意识到这是错误的,因为它提到的提交是我正在修补的站点上不存在的分支的一部分


长话短说,在创建修补程序时,请确保您位于要修补的分支上。

刚刚执行了以下操作,并且能够解决此问题:

patch -p1 < example.patch
patch-p1
我在尝试将修补程序从一个存储库应用到一个具有无关历史的存储库(同一个项目,但具有重建的git历史)时遇到了这种情况。您收到消息
fatal:sha1信息缺失或无用(dev/afile.c)
的原因是,当git尝试进行3路合并时,它需要访问该文件的状态。这些文件由格式补丁输出中的哈希指向(例如)

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

如果您尝试:

git cat-file blob <hash from patch>
现在,当您运行时:

git cat-file blob <hash from patch>
git cat文件blob

应该向您提供该文件的内容。现在再次尝试您的
git am
命令,它应该能够进行3路合并。

我也遇到过类似的冲突,第n个对我有效的解决方案是:

  • 显示无法应用的当前修补程序
  • 查找原始提交哈希/校验和/id
  • 转到要从中复制修补程序的存储库
  • 在我未能应用的提交之前检查提交
  • 按原样复制受影响的文件
  • 添加现在更改的文件
  • 继续申请流程:

  • (如果你在一个单独的窗口中执行orig_repo>命令,这实际上是一个相当快的过程,用这种方式只应用80个补丁,大约10个间距冲突=

    访问导致问题的补丁可能会有所帮助。在没有子模块的情况下也会发生。这应该是一个注释。这与
    git apply具有相同的效果。)
    对我来说。
    patch
    git apply
    都可以在工作树中创建差异,但是
    git am
    输出sha1错误。我想使用
    git am
    来保存提交消息。我发现将git格式的补丁输出管道化到
    patch-p1——合并
    ,手动修复问题,然后
    git添加.
    git-am——continue
    对我来说效果最好。请注意,这只是一个解决办法,可能有效,也可能无效。例如,对我来说,它不起作用:系列中的第4个补丁可以很好地应用于
    git-am-3
    ,打印为
    使用索引信息重建基树…
    ,因为它使用了一些技巧,比如重命名d检测等。但是,所有其他实用程序:
    patch
    git apply
    ,甚至没有
    -3
    选项的
    git am
    都无法应用该修补程序。将旧的引用添加到旧的repo有助于解决我的问题。
    git remote add old_repo
    git fech old_repo
    修复了我的问题。
    fatal: Not a valid object name <hash from patch>
    
    git remote add old_repo <url>
    git fetch old_repo
    
    git cat-file blob <hash from patch>
    
    new_repo> git am -3 /tmp/bunchopatches/*
    # 10: ERROR happens
    new_repo> git am --show-current-path | head -n 1
    # From fe89d2a53ccf30d068fdd5596a325f06b74ec4af Mon Sep 17 00:00:00 2001
    orig_repo> git checkout fe89d2a53ccf30d068fdd5596a325f06b74ec4af^
    orig_repo> cp aff/ected/files/* /new_repo/aff/ected/files/
    new_repo> git add aff/ected/files/*
    new_repo> git am --continue
    # rince and repeat (goto 10)