理想的解决方案是指定主干:refs/heads/master映射到子Git配置 http://subgit.com/book/#branches-mapping,所以 SubGit 会同步trunk with master忽略任何其他分支。
不幸的是,SubGit 目前至少需要一个分支映射(版本 1.0.x 和 2.0.x)。也就是说,必须指定如下内容:
trunk = trunk:refs/heads/master
branches = branches/*:refs/heads/*
shelves = shelves/*:refs/shelves/*
tags = tags/*:refs/tags/*
由于您不打算同步所有 Git 分支,请考虑使用一些特殊的命名空间来解决该问题:
trunk = trunk:refs/heads/master
branches = branches/*:refs/gitsvn/heads/*
...
所以,如果有人推master分支到中央 Git 存储库,它会被转换为trunk。然而,如果有人推分支foo,SubGit 会忽略该分支,因为参考文献/头/foo超出同步范围。
麻烦来自合并提交:如果提交 A 是合并分支的结果foo into master,然后 SubGit 创建分支/foo如果您不想将 SubGit 生成的分支包含到 *branches/** 命名空间中,请考虑在 Subversion 端使用一些特殊分支:
trunk = trunk:refs/heads/master
branches = gitsvn/branches/*:refs/gitsvn/heads/*
shelves = shelves/*:refs/shelves/*
tags = gitsvn/tags/*:refs/gitsvn/tags/*
在这种情况下,提交 A 的同一个父级应该被发送到git svn/分支/foo branch.
这是目前可用的最佳解决方案。我们还对 2.1 版提出了一个功能请求,该请求将为您提供理想的解决方案,但我们需要一些时间才能实现它。
SubGit 3.0 更新:
从版本 3.0.0 开始(目前为早期访问阶段,下载地址:http://subgit.com/eap http://subgit.com/eap) SubGit 支持单分支布局,因此配置文件可能如下所示:
-
没有树干,没有树枝,没有标签,没有架子:
[svn]
url = http://host.com/repos/project
在这种情况下,project目录直接映射到masterGit 存储库中的分支; SubGit 忽略任何其他分支并且从不创建架子,这意味着匿名 Git 分支不会同步到 SVN。
-
单行李箱,无架子:
[svn]
url = http://host.com/repos/project
trunk = trunk:refs/heads/master
在这种情况下,项目/主干目录被映射到masterGit 存储库中的分支; SubGit 忽略任何其他分支并且从不创建架子。
-
带架子的单行李箱:
[svn]
url = http://host.com/repos/project
trunk = trunk:refs/heads/master
shelves = shelves/*:refs/shelves/*
在这种情况下,项目/主干目录被映射到masterGit 存储库中的分支; SubGit 忽略任何其他分支,但默认情况下,它会将匿名分支转换为版本 1.0.x 和 2.0.x 的架子。
希望有帮助。