[英]git log -all shows commits removed with filter-branch
要删除我使用的存储库历史记录中不是“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并没有真正删除提交......它们仍然存在。
我错过了什么?
编辑:
子目录过滤器“只查看触及给定子目录的历史记录”。 所以也许它不会删除所有其他提交,但只是重写触及该目录的那些并以某种方式为其他人留下“孤儿”???
如果需要撤消, filter-branch
命令会为“旧”提交创建新引用。 git log --all
显示所有引用的历史记录,包括filter-branch
创建的特殊引用。
更一般地说,实际上删除提交对象的唯一git命令(我能想到)是gc
。 要使gc
删除提交,必须无法从任何ref或reflog访问它。 所以,如果你想让提交真的消失:
1)删除original/*
引用
2)擦除reflog
3)用prune=now
运行一个激进的gc
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.