迁移至Git时排除已删除的SVN分支/标签(git-svn)
解决SVN迁移Git时排除已删除分支/标签的方案
我之前帮不少团队搞定过大型SVN迁Git的活儿,这种明明已经在SVN端删了的分支、标签,还被git svn一股脑克隆下来的情况,确实挺闹心的。下面给你几个高效简便的方案,分工具来说:
方法一:用git svn精准指定要克隆的内容
git svn默认会遍历所有历史分支/标签,包括已删除的,但我们可以手动指定只拉取当前活跃的分支和标签:
先获取SVN端当前存在的分支和标签列表:
# 列出所有活跃分支 svn ls <你的SVN仓库URL>/branches/ # 列出所有活跃标签 svn ls <你的SVN仓库URL>/tags/你可以把这些输出整理成逗号分隔的列表,比如
branch1,branch2,branch3。用指定分支/标签的方式克隆:
git svn clone <你的SVN仓库URL> \ --branches branches/branch1,branches/branch2 \ --tags tags/tag1,tags/tag2 \ --trunk trunk \ 你的Git仓库目录名这样只会拉取你指定的活跃分支和标签,自动跳过已删除的内容。
如果已经用默认方式克隆了仓库,也可以补救:
先编辑.git/config文件,修改svn-remote.svn下的branches和tags配置,只保留活跃的路径,然后运行:git svn reset -r <SVN起始版本号> git svn fetch
方法二:用svn2git更智能地过滤
svn2git(Ruby版本)对SVN的分支标签结构支持更友好,默认就会忽略已删除的分支/标签,你只需要简单运行:
svn2git <你的SVN仓库URL>
如果需要更精细的控制(比如只拉部分分支),可以指定参数:
svn2git <你的SVN仓库URL> \ --branches branches/branch1,branches/branch2 \ --tags tags/tag1,tags/tag2 \ --trunk trunk
它会自动识别并跳过已删除的路径,比git svn省不少事儿,尤其适合大型仓库。
额外高效技巧:SVN端创建视图(如果有权限)
如果你有SVN仓库的管理权限,可以创建一个只包含活跃分支、标签和主干的SVN视图(比如通过svn:externals或者自定义的目录结构),然后基于这个视图克隆Git仓库。这样从源头就过滤掉了已删除的内容,迁移速度会快很多,适合超大型仓库。
内容的提问来源于stack exchange,提问作者hfm
相关产品推荐
相关产品推荐

