我使用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
正在运行有什么区别?答案 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
的运行之间的差异可能会很有趣。