【问题标题】:Finding references to git object after history wipe在历史擦除后查找对 git 对象的引用
【发布时间】:2015-08-21 17:44:24
【问题描述】:

我使用 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 tag 中为每个BRANCH 运行git log --tags=BRANCH 有什么区别?
  • 是否有一个简单的命令可以找出特定对象不符合 Git 垃圾回收条件的原因?

【问题讨论】:

    标签: git git-rewrite-history


    【解决方案1】:

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

    是否有一个简单的命令可以找出特定对象不符合 Git 垃圾回收条件的原因?

    您可以使用

    找到每个将祖先追溯到提交的 ref
    git log --graph --oneline --decorate --simplify-by-decoration --ancestry-path --all ^$commit
    

    (如果提交本身有一个 ref,用 $commit^! 替换 --all $commit 再做一次)

    请参阅this question 以查找甚至未引用的子项;对于git fsck 输出,使用--no-reflog 和没有运行之间的任何差异可能在这里很有趣。

    【讨论】:

    • 谢谢!那个命令就是我要找的!它告诉我提交是由一个名为“test2”(* f6eea78 (tag: test2))的旧标签指向的。然而,奇怪的是,如果我在上面的 git log 命令 (--tags=test2) 中明确列出该标签,它就不会出现。但是,如果我使用通配符,(--tags=test2*) 它会出现!我怀疑标签字符串本身有问题。它是在过去的某个时候以编程方式创建的,所以它的名称中可能有一些愚蠢的不可打印的字符。真奇怪。
    猜你喜欢
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多