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