如何处理这个git错误

我得到这个错误在我的git仓库:

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) 

Googlesearcherror: unable to read tree object HEAD并没有造成太大的帮助,这个错误似乎是非常罕见的。 我不知道该如何处理。 难道是硬盘故障?

编辑git fsck的输出如下:

 broken link from commit 607328dc80e4901a55b95c683d4fbf43e6df28bf to tree 8124cc15c63be92d534e4cdfa33c38d54deee122 missing tree 8124cc15c63be92d534e4cdfa33c38d54deee122 dangling tree 56b5d4a5e429d251582ec927bca7ef1225510c41 dangling tree 0259d2d38b18b6136bb6070fb41faf3624453cc6 

在“断开的链接”消息中,您可以按照GitFaq的build议 :

  • 备份你所有的状态,这样你所做的任何事情都是可以重新做的,
  • 爆炸任何腐败的包文件
    • 请参阅“ man git-unpack-objects ”,特别是“ -r ”标志。
      另外,请注意,它只解压那些还不可用的对象,所以你需要首先将它打包到正常位置(否则git-unpack-objects会find包文件中的所有对象)打包文件本身,而不是解压任何东西)
  • replace任何破损和/或丢失的物体
    • 这是具有挑战性的部分。
      有时(希望经常!)你可以find缺失的对象在其他副本的存储库。
      在其他时候,您可能需要尝试以其他方式查找数据(例如,也许您的签出副本包含散列时将丢失的对象的文件内容?)。
  • 确保一切都满意“ git fsck --full
  • 重新包装一切,再次回到有效的状态

笔记:

  • 丢失的对象也可能与备用 (当你在仓库之间共享对象 )和git交替 (即使可能有风险 )有关。
  • JGit / Egit eclipse插件也被称为有几个问题 。
    (2012年2月更新: 这些插件已经走了很长的路,现在相当稳定)

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

 git fsck --name-objects 

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

有关更多信息,请参阅“ 如何解决从树到树的git错误断开链接? ”。

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

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

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

这填补了对象数据库中缺less的对象。 版本库现在似乎已经备份了。

我有同样的问题。 经过大量的头发拉动,我发现这是由于更改了存储库的git文件的权限。 我已经解决了如下:

 $ cd .git $ chmod 755 * 

完成!

我的Homebrew安装的Git存储库中出现类似的错误。 我没有逐一恢复所有丢失的对象,而是简单地删除.git目录,并通过从Homebrew的公共存储库中重新克隆来重新创build。 这些是我的步骤:

  • 检查你的Git仓库中有哪些信息是你通过重新克隆得不到的。 对我来说,这是私人的分支机构,货盘和遥控器。
    • 通过创build一个新的分支,应用隐藏,并在名称中join类似“[WIP]”的东西,将stashes转换为真正的提交,以表明它是一个存储。
    • 通过将不在公共远程的分支推送到您自己的远程分支上。 这可能是GitHub上存储库的分支,或者是机器上不同位置的新Git存储库。
    • 如果您有多个远程设备,请保存git remote -v的输出,其中包含遥控器的名称和URL,以便以后手动添加它们。
  • 删除您的repoistory的.git目录(或将其重命名为.git-broken并稍后删除)。 在命令行上,这是rm -rf .git
  • 使用git clone https://github.com/Homebrew/homebrew.git或任何URI重新克隆远程目录。
  • 这将创build一个新的子文件夹homebrew以存储库命名。 你只需要那个.git目录; 你的本地文件已经好了。 所以mv homebrew/.git .git ,然后删除homebrew文件夹。
  • 你的Git仓库应该没有错误,因为你从头开始重新创build它。 现在只需恢复您在第一步中保存的任何信息。
    • 如果你有额外的遥控器,再次使用git remote add <name> <url>添加它们。
    • 如果您将任何分支(或转换为分支的存储)备份到远程存储库,请将其从该存储库中提取到本地存储库。
    • 如果你愿意,你可以通过使用git reset HEAD^来滚动“[WIP]”提交将存储分支转换回存储,然后用git stash save <custom-message>来将工作目录保存到一个存储。

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

 $ 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应该显示与以前相同的输出。

如果您没有无限制的更改,最简单的解决scheme是删除本地分支:git branch -D [分支名称]

然后再次检出远程分支:git checkout -b [分支名称] origin / [分支名称]

我通过在相同的目录/项目文件夹中进行更改修复了错误,然后尝试提交新的更改,发生了什么是我得到了一个错误信息“无效的对象”100644 e38e910ceb18b09f436f353c3a131bfe2caba130“Book / alise_mathe / app / src / main / res /菜单/ drawermenu.xml“这msg解决了这个问题,我只是通过改变文件名'drawer_menu.xml'重构drawermenu.xml。 添加了承诺推动的变化,这就是所有。 (机器人工作室)

我希望这有助于一些如何

我通过从远程服务器目录中删除Capistrano'repo'文件夹来解决这个错误。 我经历了其他一些build议的问题,并解决了这个问题并不在于我的本地项目。 卡皮斯特拉诺执行回购遥控时,问题似乎就出现了。 对我来说,这可能是由于停止部署,导致损坏的对象/对象引用。 我的主机也刚刚做了一个服务器迁移,可能在这个过程中被破坏了。