for del in `cat deleted.txt`
do
git filter-branch --index-filter "git rm --cached --ignore-unmatch $del" --prune-empty -- --all
# The following seems to be necessary every time
# because otherwise git won't overwrite refs/original
git reset --hard
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --aggressive --prune=now
done;
但是考虑到我们的历史记录中有数以万计的已删除文件和提交记录,运行这个脚本需要花费很长时间。两个小时前,我只为一个被删除的文件开始运行此操作,filter-branch命令仍在运行,它正在逐个检查40000多个提交记录,而且这是在一台带有SSD磁盘的新Macbook Pro上进行的。
我也阅读了页面https://help.github.com/articles/remove-sensitive-data,但它仅适用于移除单个文件。
是否有人能够做到这一点?我真的想保留当前跟踪文件的历史记录,如果我们无法保留历史记录,不确定节省空间的好处是否值得创建一个新的库。
git filter-branch --prune-empty --tree-filter
命令,并编写一个脚本,将树中的每个文件与你想要保留的文件列表(即当前跟踪的文件)进行比较,然后在任何你不想要的文件上执行git rm -f
命令。这将在历史记录的每个提交中删除不需要的文件。 - Jonathan Wakelyfilter-branch
。这可能是为什么它花费了这么长时间的原因。如果您只执行一次并传入一个命令来一次性删除您不想要的JAR文件,它可能会更快地运行。与您当前的操作相比,使用--tree-filter
选项可能会更好。 - user456814