为什么我的repo中的一些blob对象不属于任何提交都没有引用的树?
正在处理一个项目,以在少数大型存储库中对大型二进制文件进行编目。我试图了解在什么情况下您可能有 Blob -> Tree -> nothing .. 本质上是一个未附加到提交的 Blob/Tree。
我正在运行这样的东西:
- 使用以下方法获取所有 blob:
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' - 迭代 blob ( current_blob ):
- 使用获取所有提交
git log --pretty=tformat:'%T|%h|%s|%aN|%aE' - 迭代提交(current_commit):
- 使用获取提交引用的所有对象
git -C $RepoFolder ls-tree -r <current_commit.id> - 如果提交引用的任何对象与current_blob匹配,则我们已找到此 blob 的提交
我发现有些与树相关的 blob 与任何提交无关。
在什么情况下会发生这种情况?
回答
这就是所谓的不可达对象。您很可能熟悉无法访问的对象类型dangling commit,当您硬重置分支时最常发生这种情况,在此过程中删除(希望)不需要的提交。
许多其他 git 操作也会发生同样的情况,特别是每次调用git add, (正如git-gc联机帮助页指出的那样),以防您以后不提交该文件的添加状态(但可能是一秒钟后的状态add)。
在此处进一步阅读 SO:
- vgoff对旧问题“什么是悬空提交/blob 以及它们来自哪里?”的回答
- 在 git 中恢复悬空的 blob