在历史记录擦除后查找对git对象的引用

时间:2015-08-21 17:44:25

标签: git git-rewrite-history

我使用BFG从Git存储库中擦除了一个敏感文件,如果我执行了git clone,我就不能像你期望的那样使用类似的东西找到对象:

git rev-list --objects | grep my_filename

然而,在旧的克隆中,我仍然可以使用这种技术找到对象,即使我已经根据我的知识更新了它。具体来说,我跑了:

git fetch --tags --all --prune
git rebase
git reflog expire --expire=now --all && git gc --prune=now --aggressive

我还删除了这个克隆中的所有分支(除了master),但没有用。我可以看到一些标签引用了对象,因为:

git log --oneline --branches --tags -- my_filename

列出包含该文件的提交,同时:

git log --oneline --branches -- my_filename

没有(注意后者中缺少的--tags标志),但是明确地枚举了所有标签:

for tag in $(git tag); do echo $tag; git log --oneline --branches --tags=$tag -- my_filename; done
什么都没有。

我的问题是:

  • git log --tags中每个git log --tags=BRANCH的{​​{1}}和BRANCH正在运行有什么区别?
  • 是否有一个简单的命令来确定特定对象为什么不符合Git的垃圾收集条件?

1 个答案:

答案 0 :(得分:1)

不知道你的第一个问题的答案,但是

  

是否有一个简单的命令来确定特定对象为什么不符合Git的垃圾回收条件?

您可以使用

找到跟踪祖先的每个引用
git log --graph --oneline --decorate --simplify-by-decoration --ancestry-path --all ^$commit

(如果提交本身有引用,请在$commit^!替换--all $commit时再次执行

this question找到甚至未被引用的孩子;对于git fsck输出,--no-reflog和不带URLClassLoader的运行之间的差异可能会很有趣。