如何从Git仓库中丢失的blob恢复?

17

我正在运行Git 1.6.4.2。垃圾收集失败,显示“error: unable to find <SHA1>”。

我已经确定丢失的对象是一个blob文件,没有办法找回。看起来两个同时运行“git add”和“git commit”的脚本相互干扰,其中一个提交了一个比另一个更新的文件版本,并且旧版本的blob消失了。

因此,我尝试回滚我的存储库,以删除引用缺失blob的树的提交。

我知道提交所在的分支,因此对其运行了“git reset”以倒回到有问题的提交的父节点。我也知道该分支已合并到其他地方,因此我也倒回了该分支。所以据我所知,错误的提交/树/ blob没有被任何内容引用。但如果我运行git prune --expire=now,然后运行git gc,我仍会收到有关缺失对象的错误。

我如何查询Git数据库以查找包含错误blob id的每个树对象?然后如何找出是什么导致Git保留它?


试过用 git fsck 吗? http://book.git-scm.com/4_maintaining_git.html - Marcin Gil
我不确定我理解发生了什么。你能报告一下 git fsck 说了什么吗? - CB Bailey
1
经过更深入的挖掘,我发现我的问题在这里得到了解答:https://dev59.com/0Ww05IYBdhLWcg3wfx80git prune 没有清除我回滚的东西,因为 reflog 仍然在引用它 - git reflog expire --exires=now --all 解决了这个问题。参考帖子提供了一种机制,可以在每个提交上运行 git lstree 来查找引用的 blob。 - kbro
顺便说一下,git fsck什么也没说——它甚至没有告诉我有一个丢失的blob! - kbro
https://dev59.com/0Ww05IYBdhLWcg3wfx80 包含答案。 - kbro
2
建议您将您的“评论”变成一个答案。 - Philip Oakley
2个回答

13

经过更深入的挖掘,我发现我的问题在这里得到了回答:如何从 Git 存储库中删除 blob - 因为 reflog 仍在引用它,所以 git prune 没有清除我已经减少的内容。 执行

git reflog expire --expire=now --all

已修复。此外,参考帖子提供了在每次提交时运行git lstree以查找所引用 blob 的机制。


8

我遇到了同样的问题(丢失的 Blob),解决方法是:

git reflog expire --expire=now --all

这个方法并没有起作用,我在如何修复损坏的仓库中找到了解决方案。

以下是简单的一行代码,

git hash-object -w <file>

修复了丢失的 blob。


git hash-object -w <file> 允许您重新插入存储库中缺失的文件。这与我的问题截然相反。我想从存储库中删除一个错误的文件,但 git prune 无法做到这一点,因为 reflog 仍然指向它。 - kbro

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