git log -all显示使用filter-branch删除的提交

时间:2017-03-14 14:28:20

标签: 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;

现在,使用:

git log

一切似乎都很好:日志只显示包含" my_dir"中文件的提交。

可是:

git log --all

仍然显示一切。事实上,做另一个filter-branch(删除my_dir中的其他.pyc文件)会找到(并删除)旧目录中的所有.pyc文件。

似乎--subdirectory-filter并没有真正删除提交......它们仍在那里。

我错过了什么?

编辑:

子目录 - 过滤器"只查看触及给定子目录的历史记录"。所以也许它不会删除所有其他提交,但只是重写那些触及该目录并且不知何故离开"孤儿"对于其他人???

1 个答案:

答案 0 :(得分:1)

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

更一般地说,实际删除提交对象的唯一git命令(我能想到)是gc。要使gc删除提交,必须无法从任何引用或reflog访问它。所以,如果你想让提交真的消失:

1)删除original/*引用

2)擦除reflog

3)使用prune=now

运行攻击性gc