为了删除我的代码库中除了“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并没有真正删除提交...它们仍然存在。
我漏掉了什么?
编辑:
subdirectory-filter“只查看涉及给定子目录的历史记录”。所以也许它不会删除所有其他提交,而只是重写那个目录的提交,并留下其他提交的“孤立分支”???
--subdirectory-filter
仅为触及该目录的提交添加重写提交;但是,如果一个引用在其历史记录中有任何此类提交,则该引用将被重写。因此,如果您有无法到达曾经触及子目录的任何提交的引用(可以是分支或标签),那么这可能是问题所在。 - Mark Adelsberger--all
表示“refs/
中的所有引用以及HEAD本身”。 - torek