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

igsr9ssn  于 2023-01-19  发布在  Git
关注(0)|答案(9)|浏览(368)

我在我的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
roejwanj

roejwanj1#

对于"链接断开"的消息,您可以遵循GitFaq的建议:

  • 备份所有状态,以便在您进一步损坏内容时,您所做的任何操作都可以重做!
  • 分解任何损坏的包文件
  • 参见"man git-unpack-objects",特别是"-r"标志。

另外,请注意它只解压缩那些还没有可用的对象,所以您需要先将pack-file从它的正常位置移开(否则git-unpack-objects会在pack-file本身中找到pack-file中的所有对象,而不会解压缩任何对象)

  • 替换任何损坏和/或丢失的物品
  • 这是最具挑战性的部分。

有时候(希望经常如此!)您可以在存储库的其他副本中找到丢失的对象。
在其他时候,您可能需要尝试以其他方式查找数据(例如,您的检出副本可能包含散列后将成为丢失对象的文件内容?)

  • 确保使用"git fsck --full"时一切正常
  • 重新打包所有东西以再次回到高效状态

注:

(2012年2月更新:those plugins已经走过了很长的路,现在相当稳定)
2016年7月更新(7年后),随着Git 2.10即将发布,您现在拥有:

git fsck --name-objects

它有助于 * 命名 * 这些断开链接的起源
更多信息请参见"How to fix git error broken link from tree to tree?"。

s8vozzvw

s8vozzvw2#

我刚刚遇到了类似的问题。当我的笔记本电脑在git pull期间硬关机时,出现了损坏。我有一个远程备份仓库。首先,我在.git/objects/??/* 中有几个大小为零的对象文件。在对仓库进行cp -a备份后,我这样做:

  • 删除零长度对象
  • 将远程存储库克隆到../fresh/存储库中
  • 在那个坏掉的仓库里

cat ../fresh/.git/objects/pack/pack-*.pack | git unpack-objects
这填补了对象数据库中缺少的对象。存储库现在似乎已备份。

rjee0c15

rjee0c153#

我也遇到过同样的问题,经过反复推敲,我发现这是因为仓库git文件的权限被修改了,我已经解决了这个问题,具体如下:

$ cd .git
$ chmod 755 *

成交!

dz6r00yl

dz6r00yl4#

我在Homebrew安装的Git仓库中遇到了类似的错误,我发现删除.git目录并通过从Homebrew’s public repository重新克隆来重新创建它比逐个恢复所有丢失的对象更容易。

  • 检查一下你的Git仓库中有哪些信息是你无法通过重新克隆得到的,对我来说,是私有分支、隐藏和远程。
  • 通过创建一个新的分支,应用stash,并在名称中使用类似于“[WIP]”的内容来表示它是一个stash,从而将stash转换为真实的的提交。
  • 保存不在公共远程存储器上的分支,将它们推送到你自己的远程存储器上。这可以是GitHub上仓库的一个分支,也可以是你机器上其他位置的一个新Git仓库。
  • 如果您有多个远程控制器,请保存git remote -v的输出,其中包含远程控制器的名称和URL,以便以后可以手动将它们添加回去。
  • 删除存储库的.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>再次添加它们。
  • 如果您将任何分支(或转换为分支的存放)备份到远程存储库,请将它们从该存储库拉到本地存储库。
  • 如果你愿意,你可以通过使用git reset HEAD^回滚“[WIP]”提交,并使用git stash save <custom-message>将工作目录再次保存到一个stash中,从而将stash分支转换回stash。

如果运行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应显示与之前相同的输出。

sq1bmfud

sq1bmfud5#

如果没有未提交的更改,最简单的解决方案是删除本地分支:git分支-D [分支名称]
然后再次 checkout 远程分支:git checkout -B [分支名称]来源/[分支名称]

iszxjhcz

iszxjhcz6#

我通过在同一目录/项目文件夹中进行更改修复了错误,然后尝试提交新的更改,发生的情况是我收到了错误消息“无效对象100644 e38 e910 ceb 18 b 09 f436 f353 c3 a131 bfe 2caba 130 for”Book/alise_mathe/app/src/main/res/menu/drawermenu.xml“此消息解决了问题,我只是通过将文件名更改为“drawer_menu.xml "重构了drawermenu.xml。添加了提交推送的更改,仅此而已。(Android工作室)
我希望这能有所帮助

e1xvtsh3

e1xvtsh37#

我通过从我的远程服务器目录中删除Capistrano的“repo”文件夹修复了这个错误。我检查了许多其他建议的问题,并解决了这个问题,这并不是我的本地项目的问题。这个问题似乎发生在Capistrano执行从repo到远程的拉取操作时。对我来说,这可能是由于一个暂停的部署留下了损坏的对象/对象引用。2我的主机也刚刚完成了一个服务器迁移,可能在这个过程中有什么东西损坏了。

yacmzcpb

yacmzcpb8#

如果以上步骤都不起作用,并且您希望保留本地更改,并且有一个灵活的远程存储库,那么this reset script会产生很好的效果。
如果您还需要保留您的收藏,请手动复制以下文件:

  • .git/对象
  • .git/引用/隐藏
  • .git/日志/引用/隐藏
x8goxv8g

x8goxv8g9#

我通过移除遥控器并重新添加来解决此问题。
我曾经使用过git fsck --name-objects,它显示多个分支损坏。删除这些分支的本地和远程副本并没有解决这个问题。
然而,解决它的是:
git remote remove origin
然后:
git origin add origin <my-origin>
在我做了那件事之后,一切都恢复了正常。

相关问题