从整个 git 历史记录中完全删除多个文件的最快方法是什么



我正在迁移一个具有多年历史和大约 50,000 次提交的 SVN 存储库。 我使用 git-svn 创建了 SVN 存储库的 Git 导出。

我们的SVN存储库最初是使用以下结构创建的:

  1. 公司中的每个项目都有自己的文件夹,其中包含一个主干/标签/分支文件夹
  2. 共享库的源代码位于另一个文件夹中,并包含它自己的 Trunk 和 Branch 文件夹
  3. 二进制文件曾经在成功构建并创建标签后签入到 SVN

在 git-svn 导出之后,我有一个刚刚超过 15 GB 的 Git 存储库,我需要做一些认真的清理。在SVN导出期间,我们的标签和分支文件夹被视为常规文件,因此我想首先从Git存储库中删除它们,同时仍保留我们的提交历史记录。

我知道从 Git 存储库中完全删除文件的唯一方法是使用 git filter-branch ,所以我创建了一个脚本来递归浏览每个项目的 tags 文件夹,为每个文件生成如下命令:

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 行这样的行,因为我需要为每个文件运行它。运行一次是一项相当昂贵的操作,而且恐怕运行整个脚本实际上需要很长时间。

与其运行多个到达删除单个路径的filter-branch,不如运行一个运行删除所有路径的脚本的单个filter-branch

当然,如果您只想摆脱所有标签,请考虑以下情况:

git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch ./FS/Tags' --prune-empty --tag-name-filter cat -- --all

无需单独指定文件; git rm -r会递归。

哇,备份。 git-svn 旨在将您的标签和分支转换为 Git 标签和分支,但如果您使用不寻常的目录结构,则无法

您几乎肯定希望为每个项目都有一个单独的 git 存储库,并带有自己的标签和分支。 您可以使用--trunk--tags--branches来告诉git-svn每个项目所在的位置,并分别转换每个项目。 您还可以使用 --ignore-paths 来避免首先将二进制文件迁移到 git。

即使最终拥有一个大型存储库是绝对要求(我强调这是一个非常糟糕的主意(,使用 --ignore-paths 重做git-svn转换会更快,这样你就不会在 git 中拥有不需要的文件首先。

最新更新