git svn clone时如何将指定SVN目录映射为同名Git分支
问题根因
- 对
--branches参数的逻辑理解有误:该参数默认指向存放分支的父目录,git svn会扫描该路径下的所有一级子目录作为独立分支。当你直接传--branches=code_1时,git svn会尝试扫描code_1目录下的子项作为分支,不会将code_1本身识别为分支。 - 默认扫描规则存在误判:未明确限制扫描范围时,git svn会将trunk(即你指定的
code目录)下的一级子目录误识别为分支,这就是Subfolder1、Subfolder2出现在远程分支列表的核心原因。 - 本地分支不会自动生成:git svn clone默认只会创建对应trunk的本地
master分支,所有SVN端的分支拉取后只会存放在remotes/svn/远程引用路径下,需要手动操作生成本地跟踪分支。 - 失败任务的残留配置会干扰结果:如果之前在同一路径执行过失败的clone命令,残留的
.git目录配置会导致后续传入的参数不生效。
解决步骤
- 先删除之前生成的本地
ProjectLocalFolder目录,彻底清理旧的错误配置。 - 调整clone命令参数,显式指定分支映射关系,通过忽略规则排除不需要拉取的目录和trunk下的误识别项,执行命令:
echo svnpassword | git svn clone "svn/url/projectrootfolder" \ --trunk=code \ --branches="code_1:refs/remotes/svn/code_1" \ --tags="" \ --no-metadata \ --authors-file="authors.txt" \ --prefix="svn/" \ --preserve-empty-dirs \ --placeholder-filename=.gitkeep \ --username svnreader \ --ignore-paths="^code_2|^code_3|^code/Subfolder1|^code/Subfolder2" \ ProjectLocalFolder - 克隆完成后进入项目目录,执行
git svn fetch确认所有引用拉取完整。 - 执行
git branch -a验证,此时可以看到远程分支列表中存在remotes/svn/code_1项。 - 执行以下命令创建对应本地分支并建立跟踪关系:
git checkout -b code_1 svn/code_1
补充说明
如果后续需要新增拉取code_2、code_3分支,不需要重新全量clone,直接编辑项目内.git/config文件,找到[svn-remote "svn"]配置块,新增对应的分支映射行即可,示例:
[svn-remote "svn"] url = svn/url/projectrootfolder fetch = code:refs/remotes/svn/trunk branches = code_1:refs/remotes/svn/code_1 branches = code_2:refs/remotes/svn/code_2 branches = code_3:refs/remotes/svn/code_3
修改保存后再次执行git svn fetch即可拉取对应分支内容,后续再按需checkout生成本地分支。
内容的提问来源于stack exchange,提问作者N.Y
相关产品推荐
相关产品推荐

