如何确定某个提交的可达性?

时间:2019-01-16 08:33:24

标签: git

我正在尝试清理存储库:

local FIRST_COMMIT="bf450342272a94117d78eae34a140a2a39359dad"
git branch -d bad-master
git remote remove bad-remote
git rev-parse ${FIRST_COMMIT} > .git/shallow
git fsck --unreachable
git gc --prune=now

想法如下:

  • 保留一个分支(develop)分支
  • 删除所有不需要的引用
  • 使用develop / .git/shallowgc --prune分支中剪切历史记录

这样做之后,我已经验证了以下内容:

  • 没有定义遥控器
  • 没有定义标签
  • 有一个分支:develop
  • develop分支中的历史记录实际上已减少到指定的提交

但是仍然存在问题:

git rev-list --all

列出无法通过develop分支访问的提交!

我不明白为什么git fsck --unreachable没有列出,为什么git gc --prune=now没有删除那些提交。唯一的解释是,这些提交通过 other 引用是可以到达的。哪一个?

如何确定给定提交的可达性?

我期望的是:

  • 标识我到目前为止丢失的参考(分支/远程/标签/ ???)
  • 删除该引用
  • 之后,prune将删除不需要的提交。

1 个答案:

答案 0 :(得分:1)

使用git for-each-ref遍历所有引用(默认是显示它们及其哈希ID和对象类型)。

请注意,git for-each-ref仅查看引用,而不查看其对应的引用日志。在每个参考上使用git reflog来检查(或终止)他们的参考日志。删除引用会删除其引用日志,因此,如果没有其他引用,则问题很可能是develop的引用日志。但是,git rev-list --all会查看所有引用,而不查看引用日志,因此我希望还有其他引用可以找到这些提交。