git:从所有历史记录中删除文件和目录,但保留所有分支(不仅仅是主分支)

时间:2018-03-30 22:52:21

标签: git

我试过这个tutorial从我的Git历史记录中删除一些敏感文件和目录。但是,最后,我的新存储库只有1个分支:主分支。

如何在保留所有分支的同时从Git历史记录中删除文件和目录?

谢谢!

我使用的

命令(来自教程):

cd /tmp 

git clone https://MY_GIT_REPOSITORY.git workingrepo

cd workingrepo

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do

git branch --track ${branch##*/} $branch 

done 

git filter-branch --tag-name-filter cat --index-filter 'git rm -r --cached --ignore-unmatch FILE_LIST' --prune-empty -f -- --all 

rm -rf .git/refs/original/ 

git reflog expire --expire=now --all 

git gc --aggressive --prune=now

1 个答案:

答案 0 :(得分:2)

根据您发布的内容,应该有效。的:

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do
    git branch --track ${branch##*/} $branch
done

sequence应该为原始存储库中的每个分支创建一个分支。如果您之后检查分支集,您应该看到正确的名称。 (与仅使用git clone --mirror进行初始克隆相比,此方法有点笨拙,但有时候有理由避免使用--mirror,这会产生裸克隆。)

过滤分支操作(在此处分割用于过帐的行):

git filter-branch --tag-name-filter cat \
    --index-filter 'git rm -r --cached --ignore-unmatch FILE_LIST' \
    --prune-empty -f -- --all 
然后

应该在所有分支上运行(最后--all);索引过滤器将删除名为FILE_LIST的文件(可能这是实际文件列表的缩写),您应该看到许多进度消息以及filter-branch更新的分支名称列表。 / p>

此时您可以再次检查分支名称;它们应该与之前的名称相同(尽管它们指向的提交哈希值可能通常不同)。

其余命令会进行一些清理。 --aggressive是不必要的(请参阅Linus Torvalds' explanation here),但使用git gc或重新克隆适合丢弃不需要的对象。这些对分支名称没有影响,因此这两个特定点可以检查出错的原因。