【问题标题】:git - recover from bad tree object?git - 从坏树对象中恢复?
【发布时间】:2018-07-23 07:58:27
【问题描述】:

我在本地和远程都迁移了一个存储库,现在由于树对象错误,我无法推送(或做很多事情),

> git push
error: Could not read 4218a5a380d8b6cbc7f461c22cb48ed66a92c850
fatal: bad tree object 4218a5a380d8b6cbc7f461c22cb48ed66a92c850
fatal: The remote end hung up unexpectedly

4218a5a380d8b6cbc7f461c22cb48ed66a92c850 在我的文件系统中不存在,

> dir 4218a5a380d8b6cbc7f461c22cb48ed66a92c850 /s /p
 Volume in drive C is OS
 Volume Serial Number is xxxxxxxx
File Not Found

我有我所有的源代码文件。我现在唯一的选择是核对 git 存储库并重新开始历史记录吗?

【问题讨论】:

  • 您在发布问题之前有tried any of these options 吗?
  • 是的,git reset --hard 不能解决问题。
  • 从该十六进制中删除前两位数字并重复您的 dir 命令 dir 18a5a380.... /s /p ,这会返回任何内容吗?还知道它可能驻留在包文件中,因此您的 dir 命令实际上对您没有帮助。
  • 我搜索了18a5a380d8b6cbc7f461c22cb48ed66a92c850。它也不存在。 git reflog --all 中有一个指向 4218a5a380d8b6cbc7f461c22cb48ed66a92c850 的提交,该提交是合并到 origin/master。 origin/master 在 github,但现在我的遥控器是 bitbucket。
  • git fsck 说什么?

标签: git corruption


【解决方案1】:

git reflog 中有一个提交 --all 指向 4218a5a380d8b6cbc7f461c22cb48ed66a92c850,该提交是合并到 origin/master

如果您有远程对象,并且您有一些本地工作不想因丢弃本地存储库而丢失,您可以将git clone 到临时目录 TMP,然后从TMP/.git/objects/pack 复制所有文件进入文件夹中的.git/objects/pack 子目录。然后再次运行 git fsck 以查看它是否有帮助以及还有多少问题。

【讨论】:

  • 不幸的是,当 git 第一次损坏时,我删除并重新创建了远程,这消除了从远程恢复的机会。
【解决方案2】:

“核弹和铺路”选项不一定是您的唯一选项,但它可能是您最好的选项。 “坏树对象”是一个不寻常的错误,表明您的存储库的某些部分可能已损坏(由于磁盘故障,或恶意进程/恶意软件/任何覆盖您的文件,或试图将 Git 存储库存储在保管箱文件夹中,或谁知道什么)。不过,如果你要对它进行核攻击,你可能需要先备份它以防万一。

如果您在没有任何选项的情况下执行git push,这表明您有一个单独的存储库副本(可能有点过时),其中大部分代码可能在另一台机器上。其他地方的单独副本可能仍然很好。您可以通过将其克隆到新位置来检查这一点,然后使用您可以从损坏的存储库中抢救的任何内容进行的新提交更新新克隆,然后推送这些新提交,以便将新提交添加到其他存储库中其他机器。然后你就可以真正对 nuke-and-pave 感到满意了,因为你有两个好的副本:一个在你的新克隆中(在这个场景中是第三个 Git),另一个在另一台机器上(这里是第二个 Git——第一个 Git 是你的损坏的存储库)。

还值得对最初损坏存储库的原因进行一些背景调查,因为这可能仍在继续。


顺便说一句,即使树对象4218a5a380d8b6cbc7f461c22cb48ed66a92c850 作为松散对象存在,它也不会在名为4218a5a380d8b6cbc7f461c22cb48ed66a92c850 的文件中。它将位于名为 42 的目录中,并存储为名为 18a5a380d8b6cbc7f461c22cb48ed66a92c850 的文件。

如果对象已打包,它根本不会作为一个单独的文件存在,而是作为某个打包文件中的打包对象(其名称不可预测)。

【讨论】:

  • 除了某种类型的灾难性故障(适时停电,git 中的异常和段错误等),我得到损坏存储库的唯一其他情况(mercurial 和 git 两者)是通过使用文件夹/磁盘同步工具,例如 Dropbox。
猜你喜欢
  • 1970-01-01
  • 2011-09-26
  • 2011-08-11
  • 1970-01-01
  • 2016-09-02
  • 2011-04-06
  • 1970-01-01
  • 2010-12-05
  • 2023-03-06
相关资源
最近更新 更多