SubGit:如何排除分支?

时间:2013-05-16 13:02:57

标签: git svn git-svn subgit

我正在测试SubGit作为从SVN迁移到Git的一种方式。

我想要做的是能够在git存储库中创建远程分支,所有用户都可以使用同步回SVN。

我只希望SubGit跟踪主分支并将其同步回SVN,以便我们可以自由使用和共享其他Git分支。

有一种简单的方法吗?

谢谢

1 个答案:

答案 0 :(得分:7)

理想的解决方案是在SubGit configuration中指定 trunk:refs / heads / master 映射,因此SubGit会将 trunk 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会忽略该分支,因为 refs / heads / foo 不在同步范围内。

麻烦来自合并提交:如果提交A是将 foo 分支合并到 master 中的结果,那么SubGit会创建 branches / foo 在Subversion方面,对应于提交A的父对象。如果你不想将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的同一父节点发送到 gitsvn / branches / foo 分支。

这是目前最好的解决方案。我们还有2.1版的功能请求,可以为您提供理想的解决方案,但在实施之前需要一些时间。

更新SubGit 3.0:

从版本3.0.0(目前的早期访问阶段,在http://subgit.com/eap下载)SubGit支持单分支布局,因此配置文件可能如下所示:

  1. 没有行李箱,没有树枝,没有标签,没有货架:

    [svn]
        url = http://host.com/repos/project
    

    在这种情况下, project 目录直接映射到Git存储库中的 master 分支; SubGit忽略任何其他分支,从不创建货架,这意味着匿名Git分支不会同步到SVN。

  2. 单行李箱,没有货架:

    [svn]
        url = http://host.com/repos/project
        trunk = trunk:refs/heads/master
    

    在这种情况下, project / trunk 目录映射到Git存储库中的 master 分支; SubGit忽略任何其他分支,从不创建货架。

  3. 带架子的单行李箱:

    [svn]
        url = http://host.com/repos/project
        trunk = trunk:refs/heads/master
        shelves = shelves/*:refs/shelves/*
    

    在这种情况下, project / trunk 目录映射到Git存储库中的 master 分支; SubGit会忽略任何其他分支,但默认情况下它会将匿名分支转换为货架,因为版本1.0.x和2.0.x。

  4. 希望有所帮助。