我正在迁移具有多年历史和大约50,000次提交的SVN存储库。我使用git-svn创建了SVN存储库的Git导出。
我们的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行,因为我需要为每个文件运行它。运行一次这是一个非常昂贵的操作,我担心运行整个脚本将永远需要。
答案 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中拥有不需要的文件。