仅从对象中恢复Git仓库

9

我有一台Windows电脑,它突然决定删除了大部分Git仓库(可能触发了重要工作检测器)。我现在只剩下对象文件。我不确定这些对象文件的完整性。是否可以仅从对象文件中恢复数据?据我所知,对象树是完整的。所有的包和散装对象都在原处;我只是没有元数据来证明Git。


什么是“只有对象”? - The Lazy Coder
这个命令 git show -s 显示什么? - The Lazy Coder
致命错误:不是git仓库。 - Jashank Jeremy
谢谢,Jason。非常感谢。 - Jashank Jeremy
展示对象树,上面满满都是对象。这就是我所拥有的一切。没有引用,没有日志,只有对象。 - Jashank Jeremy
显示剩余2条评论
3个回答

16
我会尝试的第一步是使用git init初始化一个新的代码库。然后我会将死亡代码库中的objects目录复制到新的代码库中。接着在新的代码库中运行git fsck

如果你幸运的话,你会看到很多悬挂的对象,再加上一点运气,其中一些悬挂的对象将是丢失分支的末端提交对象。

如果你在这些提交对象上运行git show和/或git log,你可能会认出一些分支。

要“恢复”它们,你可以使用git branch重新创建命名分支。


太棒了!我有一个坏的SHA-1文件,需要想办法重命名它(Witless将其重命名为“e”,这并不有用),还需要重新附加我的HEAD,但是那个工作得非常好。谢谢你,Charles! - Jashank Jeremy
1
我不确定如何找到提交的原始名称,但重新附加HEAD就像git checkout <last-commit-hash>一样简单,然后创建一个master分支。现在,我需要找到00/e应该是什么。 - Jashank Jeremy
@Jashank:如果松散对象是有效的,您还可以“欺骗”Git从(可能)不相关的松散对象路径名中读取它(在SO5585388中演示了“损坏”),然后将其写入正确的路径。 bash -c' i = 1; while n = $(printf%040x $ i)&& git cat-file-s“$ n”>/ dev / null 2>&1; do let i ++; done; p = $(printf .git / objects /%.2s /%s“$ n”“$ {n#??}”); echo“在$p处使用临时对象名称$n”; set-x; cp-p“$ 1”“$ p” && t = $(git cat-file-t“$ n”)&& git cat-file“$ t”“$ n”| git hash-object --stdin -t“$ t”-w && rm-f“$ p”'- .git / objects / 00 / e - Chris Johnsen
@Chris - 这就是...哇。这是我见过的最好的扭曲Bash。我确实设法恢复了文件:Git报告检出时删除了一个文件,所以我去寻找,找到了文件,并将其移入。 - Jashank Jeremy

0
如果你还没有尝试过 git checkout master,我建议先从这里开始。

1
无法找到 Git 代码库。"fatal: Not a git repository (or any parent up to mount parent ). Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)." - Jashank Jeremy

0

看起来前几个命令可能会有所帮助。它演示了如何从objects目录中解压缩pack文件夹。 - The Lazy Coder
是的,我会试一下。现在我需要初始化一个新的Git仓库吗? - Jashank Jeremy
可能不会。我建议你备份一下现有的内容,这样就不会再丢失了。我现在得走了,等我回来再看看。 - The Lazy Coder
我认为这不是最优的方法。没有证据表明对象已经受到损坏,因此解包和恢复对象不应该是必要的。将对象(无论是打包还是松散)恢复到一个工作的git仓库中,然后从那里开始应该就足够了。 - CB Bailey
如果你有如何实现的例子,我非常愿意将它们放上去。 - The Lazy Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接