要删除我的存储库历史记录中不是“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 并没有真正删除提交......它们仍然存在。
我缺少什么?
编辑:
子目录过滤器“仅查看涉及给定子目录的历史记录”。所以也许它不会删除所有其他提交,而只是重写那些触及该目录的提交,并以某种方式为其他提交留下“孤儿”???
该filter-branch命令会为“旧”提交创建新的引用,以防您需要撤消。 显示所有git log --all引用的历史记录,包括创建的特殊引用。filter-branch
更一般地说,(我能想到的)唯一真正删除提交对象的 git 命令是gc. 要gc删除提交,必须无法从任何引用或引用日志访问该提交。因此,如果您希望提交真正消失:
1)删除original/*引用
2)清除reflog
3) 运行激进的GCprune=now