1

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

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

  1. 公司中的每个项目都有自己的文件夹,其中包含 Trunk/Tags/Branches 文件夹
  2. 共享库的源代码位于另一个文件夹中,并包含它自己的 Trunk 和 Branches 文件夹
  3. 在成功构建并创建标签后,二进制文件曾经被签入到 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 行这样的行,因为我需要为每个文件运行它。运行一次是一项相当昂贵的操作,而且我担心运行整个脚本会花费很长时间。

4

2 回答 2

3

与其运行多个filter-branches 来删除单个路径,不如让一个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会递归。

于 2013-10-10T23:15:48.173 回答
1

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

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

即使最终拥有一个大存储库是绝对要求(我强调这是一个非常糟糕的主意),重做转换也会更快git-svn,因此--ignore-paths您永远不会在 git 中首先拥有不需要的文件地方。

于 2013-10-10T23:18:01.193 回答