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

在历史记录擦除后查找对git对象的引用,git,git-rewrite-history,Git,Git Rewrite History,我使用从Git存储库中擦除了一个敏感文件,如果我执行Git克隆,我无法像您所期望的那样,使用以下内容找到对象: git rev-list --objects | grep my_filename 然而,在一个旧的克隆中,我仍然可以使用这种技术找到对象,即使我已经尽我所知对其进行了更新。具体而言,我运行了: git fetch --tags --all --prune git rebase git reflog expire --expire=now --all && git g

我使用从Git存储库中擦除了一个敏感文件,如果我执行
Git克隆
,我无法像您所期望的那样,使用以下内容找到对象:

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
我还删除了此克隆中的所有分支(主分支除外),但没有任何效果。我可以看到一些标记引用了对象,因为:

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-tag
    中的每个
    BRANCH
    ,git-log--tags与运行
    git-log--tags=BRANCH
    之间有什么区别
  • 是否有一个简单的命令来解释为什么一个特定的对象不能通过Git进行垃圾收集

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

      是否有一个简单的命令来解释为什么一个特定的对象不能通过Git进行垃圾收集

      你可以找到每一个引用,它可以追溯到一个提交的祖先

      git log --graph --oneline --decorate --simplify-by-decoration --ancestry-path --all ^$commit
      
      (如果提交本身有一个ref,则用
      $commit^!
      替换
      --all$commit
      )再次执行该操作)


      看看能不能找到哪怕是未被提及的孩子;对于
      git fsck
      输出,使用
      --no-reflog
      运行与不使用
      --no-reflog
      运行之间的任何差异在这里可能会很有趣。

      谢谢!那个命令就是我要找的!它告诉我commit是由一个名为“test2”的旧标记指向的(
      *f6eea78(tag:test2)
      )。然而,奇怪的是,如果我在上面的git log命令中明确列出该标记(
      --tags=test2
      ),它就不会出现。但是,如果我使用通配符(
      --tags=test2*
      ),它确实会出现!我怀疑标记字符串本身有问题。它是在过去的某个时候以编程方式创建的,因此它的名称中可能有一些愚蠢的不可打印字符。真奇怪。