如何处理Git“无法读取”错误


How to deal with Git “Could not read” error

我在我的git存储库中收到此错误:

1
2
3
4
5
22:09:15 $ git status
# On branch master
error: Could not read 8124cc15c63be92d534e4cdfa33c38d54deee122
error: unable to read tree object HEAD
nothing to commit (working directory clean)

谷歌搜索error: unable to read tree object HEAD并没有带来太多帮助,这个错误似乎非常罕见。 我不知道如何处理它。 这可能是硬盘故障吗?

编辑:
git fsck的输出如下:

1
2
3
4
5
broken link from  commit 607328dc80e4901a55b95c683d4fbf43e6df28bf
              to    tree 8124cc15c63be92d534e4cdfa33c38d54deee122
missing tree 8124cc15c63be92d534e4cdfa33c38d54deee122
dangling tree 56b5d4a5e429d251582ec927bca7ef1225510c41
dangling tree 0259d2d38b18b6136bb6070fb41faf3624453cc6


在"断开链接"消息上,您可以遵循GitFaq建议:

  • back up all your state so that anything you do is re-doable if you corrupt things more!
  • explode any corrupt pack-files

    • See"man git-unpack-objects", and in particular the"-r" flag.
      Also, please realize that it only unpacks objects that aren't already available, so you need to move the pack-file away from its normal location first (otherwise git-unpack-objects will find all objects that are in the pack-file in the pack-file itself, and not unpack anything at all)
  • replace any broken and/or missing objects

    • This is the challenging part.
      Sometimes (hopefully often!) you can find the missing objects in other copies of the repositories.
      At other times, you may need to try to find the data some other way (for example, maybe your checked-out copy contains the file content that when hashed will be the missing object?).
  • make sure everything is happy with"git fsck --full"
  • repack everything to get back to an efficient state again

笔记:

  • 丢失的对象也可以与替换(当您在存储库之间共享对象时)与git替换相关(即使这可能有风险)。
  • 还知道JGit / Egit eclipse插件有一些问题。
    (2012年2月更新:这些插件已经走了很长一段路,而且现在非常稳定)

2016年7月更新(7年后续),即将发布Git 2.10,您现在拥有:

1
git fsck --name-objects

它有助于命名那些断开链接的来源

请参阅"如何修复从树到树的git错误链接?"更多。


我刚才有类似的问题。当我的笔记本电脑在git pull期间硬关机时,就会出现腐败现象。我有一个远程备份存储库。首先,我在.git / objects / ?? / *中有几个零大小的目标文件。在存储库的cp -a备份之后,我这样做了:

  • 删除零长度对象
  • 将远程存储库克隆到../fresh/存储库中
  • 在破碎的存储库中,我做到了

    cat ../fresh/.git/objects/pack/pack-*.pack | git unpack-objects

这填补了对象数据库中缺少的对象。存储库现在似乎已备份。


我有同样的问题。经过大量的拔毛,我发现它是由更改了对存储库的git文件的权限造成的。我解决了它如下:

1
2
$ cd .git
$ chmod 755 *

完成!


我在我的Homebrew安装的Git存储库中遇到了类似的错误。我没有逐个恢复所有丢失的对象,而是发现通过从Homebrew的公共存储库重新克隆来简单地删除.git目录并再次创建它更容易。这些是我的步骤:

  • 检查Git存储库中您只能通过重新克隆获得的信息。对我来说,这是私人分支机构,藏匿处和遥控器。

    • 通过创建一个新分支,应用存储,并在名称中提交类似"[WIP]"的内容来将存储转换为实际提交,以显示它是一个存储。
    • 保存不在公共遥控器上的分支,将它们推送到您自己的遥控器上。这可能是GitHub上的存储库的分支,或者只是机器上不同位置的新Git存储库。
    • 如果您有多个遥控器,请保存git remote -v的输出,其中包含遥控器的名称和URL,以便稍后手动添加它们。
  • 删除您的repoistory的.git目录(或将其重命名为.git-broken并稍后删除)。在命令行上,这是rm -rf .git
  • 使用git clone https://github.com/Homebrew/homebrew.git或任何URI重新克隆远程目录。
  • 这将创建一个以存储库命名的新子文件夹homebrew。你只想要那个.git目录;你的本地文件已经没问题。所以mv homebrew/.git .git,然后删除homebrew文件夹。
  • 您的Git存储库应该没有错误,因为您从头开始重新创建它。现在只需恢复您在第一步中保存的所有信息。

    • 如果您有其他遥控器,请使用git remote add 再次添加它们。
    • 如果您将任何分支(或转换为分支的存储分区)备份到远程存储库,请将它们从该存储库中提取到本地存储库。
    • 如果需要,可以通过使用git reset HEAD^滚动"[WIP]"提交并使用git stash save 将工作目录再次保存到存储库,将存储分支转换回存储。

如果您运行git fsck,您应该看到没有错误:

1
2
3
4
5
$ git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (197135/197135), done.
Checking connectivity: 197162, done.
$

git stash listgit branchgit remote -v应显示与之前相同的输出。


我通过从远程服务器目录中删除Capistrano'repo'文件夹来修复此错误。我经历了一些其他建议的问题并解决了问题不在于我的本地项目。当Capistrano执行从回购中拉到遥控器时,问题似乎发生了。对我来说,这可能是由于停止部署导致损坏的对象/对象引用。我的主机也刚刚完成了服务器迁移,也许在这个过程中出现了问题。


我通过在同一目录/项目文件夹中进行更改来修复错误,然后尝试提交新的更改,发生的事情是我收到了错误消息msg'无效对象100644 e38e910bbbbbbf436f353c3a131bfe2caba130 for'Book / alise_mathe / app / src / main / res /菜单/ drawermenu.xml"
这个msg解决了这个问题,我只是通过将文件名改为'drawer_menu.xml'来重构了drawermenu.xml。添加了推送的更改,这就是全部。 (机器人工作室)

我希望这会有所帮助


如果您没有未经修改的更改,最简单的解决方案是删除本地分支:
git branch -D [分支名称]

然后再次签出远程分支:
git checkout -b [分支名称]来源/ [分支名称]