如何处理Git"无法读取"错误

Fra*_*rth 45 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)
Run Code Online (Sandbox Code Playgroud)

谷歌搜索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
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 26

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

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

笔记:

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

git fsck --name-objects
Run Code Online (Sandbox Code Playgroud)

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

有关更多信息,请参阅" 如何修复从树到树的git错误链接? ".


Til*_*gel 18

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

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

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

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


Hon*_*rny 6

我有同样的问题。经过一番摸索,我发现这是由于对存储库的 git 文件的权限更改造成的。我已经解决了如下:

$ cd .git
$ chmod 755 *
Run Code Online (Sandbox Code Playgroud)

完毕!


Ror*_*ane 5

我在Homebrew install\xe2\x80\x99s Git 存储库中遇到类似的错误。我发现,与一一恢复所有丢失的对象相比,只需删除该目录并通过从Homebrew\xe2\x80\x99s 公共存储库.git重新克隆来重新创建它会更容易。这些是我的步骤:

\n
    \n
  1. 检查 Git 存储库中的哪些信息是您通过重新克隆无法获得的\xe2\x80\x99 信息。对我来说,它是私人分支机构、储藏室和遥控器。\n
      \n
    • 通过创建一个新分支,应用存储,并在名称中使用类似 \xe2\x80\x9c[WIP]\xe2\x80\x9d 的内容来提交,以表明它\xe2\x80\x99是一个存储,将存储转换为真正的提交。
    • \n
    • 通过将不在公共远程的分支推送到您自己的远程来保存它们。这可能是 GitHub 上存储库的分支,或者只是计算机上不同位置的新 Git 存储库。
    • \n
    • 如果您有多个遥控器,请保存 的输出git remote -v,其中包含遥控器的名称和 URL,以便您稍后可以手动将它们添加回来。
    • \n
    \n
  2. \n
  3. 删除您的 repoistory\xe2\x80\x99s.git目录(或将其重命名为.git-broken并稍后删除)。在命令行上,这是rm -rf .git.
  4. \n
  5. 使用 URI 或任何 URI 重新克隆远程目录git clone https://github.com/Homebrew/homebrew.git
  6. \n
  7. 这将创建一个homebrew以存储库命名的新子文件夹。您只需要.git其中的目录;你的本地文件已经没问题了。所以mv homebrew/.git .git,然后删除该homebrew文件夹。
  8. \n
  9. 您的 Git 存储库应该没有错误,因为您是从头开始重新创建的。现在只需恢复您在第一步中保存的所有信息即可。\n
      \n
    • 如果您有其他遥控器,请使用 再次添加它们git remote add <name> <url>
    • \n
    • 如果您将任何分支(或转换为分支的存储)备份到远程存储库,请将它们从该存储库拉取到本地存储库。
    • \n
    • 如果需要,您可以通过回滚 \xe2\x80\x9c[WIP]\xe2\x80\x9d 提交并将git reset HEAD^工作目录再次保存到存储,将存储分支转换回存储git stash save <custom-message>
    • \n
    \n
  10. \n
\n

如果运行git fsck,您应该不会看到任何错误:

\n
$ git fsck\nChecking object directories: 100% (256/256), done.\nChecking objects: 100% (197135/197135), done.\nChecking connectivity: 197162, done.\n$\n
Run Code Online (Sandbox Code Playgroud)\n

并且git stash listgit branch、 和git remote -v应显示与之前相同的输出。

\n