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

时间:2013-10-10 23:09:20

标签: git

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

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

  1. 公司中的每个项目都有自己的文件夹,其中包含Trunk / Tags / Branches文件夹
  2. 共享库的源代码位于另一个文件夹中,并包含它自己的Trunk和Branches文件夹
  3. 在成功构建并创建标记之后,二进制文件曾用于签入SVN
  4. 在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行,因为我需要为每个文件运行它。运行一次这是一个非常昂贵的操作,我担心运行整个脚本将永远需要。

2 个答案:

答案 0 :(得分:3)

而不是运行多个filter-branch es来删除单个路径,而是使用一个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会递归。

答案 1 :(得分:1)

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

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

即使最终拥有一个大型存储库是一个绝对的要求(并且我强调这是一个非常糟糕的主意),它将方式更快地重做{{1}使用git-svn进行转换,这样您就不会在git中拥有不需要的文件。