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

时间:2009-10-02 02:13:52

标签: 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)

谷歌搜索error: 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

8 个答案:

答案 0 :(得分:25)

在“已损坏的链接”消息中,您可以关注GitFaq recommendations

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

注意:

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

git fsck --name-objects

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

有关详情,请参阅“How to fix git error broken link from tree to tree?”。

答案 1 :(得分:16)

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

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

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

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

答案 2 :(得分:4)

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

$ cd .git
$ chmod 755 *

完成!

答案 3 :(得分:2)

我的Homebrew安装的Git存储库中出现了类似的错误。我没有逐个恢复所有丢失的对象,而是简单地删除.git目录并通过从Homebrew’s public repository重新克隆再次创建目录。这些是我的步骤:

  • 检查您在Git存储库中只有重新克隆才能获得的信息。对我来说,这是私人分支机构,藏匿处和遥控器。
    • 通过创建新分支,应用存储,并在名称中提交类似“[WIP]”的内容,将存储转换为实际提交,以显示它是存储。
    • 将不在公共遥控器上的分支机构推送到您自己的遥控器上。这可能是GitHub上的存储库的分支,或者只是机器上不同位置的新Git存储库。
    • 如果您有多个遥控器,请保存git remote -v的输出,其中包含遥控器的名称和网址,以便您稍后再手动添加。
  • 删除您的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 <name> <url>再次添加。
    • 如果您将任何分支(或转换为分支的stas)备份到远程存储库,请将它们从该存储库中提取到本地存储库。
    • 如果需要,可以通过使用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应显示与之前相同的输出。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

我希望这会有所帮助

答案 6 :(得分:0)

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

答案 7 :(得分:0)

如果以上步骤均不起作用,并且您要保留本地更改并保留了远程存储库,则this reset script会产生奇迹。

如果您还需要保留存储,请手动复制以下文件:

  • .git / objects
  • .git / refs / stash
  • .git / logs / refs / stash