git log -all 显示使用过滤器分支删除的提交

Leo*_*Leo 5 git

要删除我的存储库历史记录中不是“my_dir/”的所有内容,我使用了:

git filter-branch --prune-empty --subdirectory-filter my_dir/  --prune-empty --tag-name-filter cat -- --all
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d;
git reflog expire --expire=now --all;
git gc --prune=now;
Run Code Online (Sandbox Code Playgroud)

现在,使用:

git log
Run Code Online (Sandbox Code Playgroud)

一切看起来都很好:日志仅显示包含“my_dir”中文件的提交。

但:

git log --all
Run Code Online (Sandbox Code Playgroud)

仍然显示一切。事实上,执行另一个过滤分支(以删除 my_dir 中的一些其他 .pyc 文件)将找到(并删除)旧目录中的所有 .pyc 文件。

看来 --subdirectory-filter 并没有真正删除提交......它们仍然存在。

我缺少什么?

编辑:

子目录过滤器“仅查看涉及给定子目录的历史记录”。所以也许它不会删除所有其他提交,而只是重写那些触及该目录的提交,并以某种方式为其他提交留下“孤儿”???

Mar*_*ger 2

filter-branch命令会为“旧”提交创建新的引用,以防您需要撤消。 显示所有git log --all引用的历史记录,包括创建的特殊引用。filter-branch

更一般地说,(我能想到的)唯一真正删除提交对象的 git 命令是gc. 要gc删除提交,必须无法从任何引用或引用日志访问该提交。因此,如果您希望提交真正消失:

1)删除original/*引用

2)清除reflog

3) 运行激进的GCprune=now