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

git:从所有历史记录中删除文件和目录,但保留所有分支(不仅仅是主分支),git,Git,我试图从我的Git历史记录中删除一些敏感文件和目录。然而,最后,我的新存储库只有一个分支:主分支 如何在保留所有分支的同时从Git历史记录中删除文件和目录 谢谢大家! 我使用的命令(来自教程): 从你发布的内容来看,这应该是有效的。委员会: sequence应该为原始存储库中的每个分支创建一个分支。如果随后检查分支集,应该会看到正确的名称。(与仅对初始克隆使用git clone--mirror相比,此方法有点笨拙,但有时有理由避免使用生成裸克隆的--mirror。) 筛选分支操作(此处为过帐目的

我试图从我的Git历史记录中删除一些敏感文件和目录。然而,最后,我的新存储库只有一个分支:主分支

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

谢谢大家!

我使用的命令(来自教程):


从你发布的内容来看,这应该是有效的。委员会:

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

筛选分支操作(此处为过帐目的拆分行):

然后应在所有分支上进行操作(
--all
结尾);索引过滤器将删除名为
file\u LIST
的文件(可能这是实际文件列表的缩写),您应该会看到许多进度消息以及更新的
过滤器分支
的分支名称列表

此时可以再次检查分支名称;它们的名称应该与以前相同(尽管它们所指向的提交哈希可能不同,而且通常也会不同)


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

从您发布的内容来看,这应该是有效的。委员会:

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

筛选分支操作(此处为过帐目的拆分行):

然后应在所有分支上进行操作(
--all
结尾);索引过滤器将删除名为
file\u LIST
的文件(可能这是实际文件列表的缩写),您应该会看到许多进度消息以及更新的
过滤器分支
的分支名称列表

此时可以再次检查分支名称;它们的名称应该与以前相同(尽管它们所指向的提交哈希可能不同,而且通常也会不同)


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

我不这么认为。分支将防止删除旧的不安全提交。@evolutionxbox甚至不可能逐个分支执行此操作?所以您想从提交中筛选出文件,然后移动分支?@evolutionxbox我想保留所有分支,但从每个分支的历史记录中删除这些特定文件。显示您使用的所有命令(如有可能,填写输出)。我不这么认为。分支可以防止删除旧的不安全提交。@evolutionxbox甚至不可能逐个分支执行此操作?所以您想从提交中筛选出文件,然后移动分支?@evolutionxbox我想保留所有分支,但从每个分支的历史记录中删除这些特定文件。显示所有分支e您使用的命令(如果可能,请完成输出)。
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
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