我正在迁移一个具有几年历史和大约 50,000 次提交的 SVN 存储库。我使用 git-svn 创建了 SVN 存储库的 Git 导出。
我们的 SVN 存储库最初是使用以下结构创建的:
- 公司中的每个项目都有自己的文件夹,其中包含 Trunk/Tags/Branches 文件夹
- 共享库的源代码位于另一个文件夹中,并包含它自己的 Trunk 和 Branches 文件夹
- 在成功构建并创建标签后,二进制文件曾经被签入到 SVN
在 git-svn 导出之后,我有一个刚刚超过 15 GB 的 Git 存储库,我需要做一些认真的清理工作。在 SVN 导出期间,我们的标签和分支文件夹被视为常规文件,因此我想首先从我们的 Git 存储库中删除它们,同时仍保留我们的提交历史记录。
我知道从 Git 存储库中完全删除文件的唯一方法是使用git filter-branch
,因此我创建了一个脚本来递归遍历每个项目的标签文件夹,为每个文件生成如下命令:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch ./FS/Tags/v2.2.32/Handheld/FSFormView.cpp' --prune-empty --tag-name-filter cat -- --all
我的问题是我生成的脚本中有近 450,000 行这样的行,因为我需要为每个文件运行它。运行一次是一项相当昂贵的操作,而且我担心运行整个脚本会花费很长时间。