Git - 如何从丢失的blob中恢复

时间:2011-09-08 11:25:39

标签: database git

我正在运行git 1.6.4.2。垃圾收集失败说“错误:无法找到<SHA1>”。

我已经设法确定丢失的对象是blob,并且我无法恢复blob文件。似乎运行“git add”和“git commit”的2个脚本同时运行并且设法相互干扰,因此一个文件提交的文件比另一个版本更新,旧版本的blob消失了。

所以我现在要做的就是回滚我的存储库以取出引用缺少blob的树的提交。

我知道提交所在的分支,所以我在其上运行“git reset”以回退到duff提交的父级。而且我知道分支在其他地方合并了,所以我也把那个分支倒了。据我所知,duff commit / tree / blob没有被任何东西引用。但是,如果我运行git prune --expire = now然后是git gc,那么我仍然会收到有关丢失对象的错误。

所以我的问题是:如何查询git数据库以查找包含duff blob id的每个树对象?然后我如何找出导致git prune保留它的原因?

棘手!!

由于 凯文

2 个答案:

答案 0 :(得分:11)

经过多一点挖掘后发现我的问题在这里得到了解答:How to delete a blob from git repo - git prune并未修剪我要回收的东西,因为reflog仍然指的是它。运行

git reflog expire --expire=now --all

解决了这个问题。此外,引用的帖子提供了一种机制,用于在每次提交时运行git lstree以查找引用的blob。

答案 1 :(得分:5)

我有同样的问题(缺少blob)和

的解决方案
git reflog expire --expire=now --all

没有做到这一点。 我在这里找到了我的解决方案:https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F

这个简单的行

git hash-object -w <file>

修复了丢失的blob。

希望这有帮助。