6

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

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

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

有没有一种简单的方法可以做到这一点?

谢谢

4

1 回答 1

8

理想的解决方案是在SubGit 配置中指定trunk:refs/heads/master映射,因此 SubGit 将主干与主干同步,而忽略任何其他分支。

不幸的是,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 在 Subversion 端为提交 A 的相应父级创建分支/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 的同一个父级应该被发送到gitsvn/branches/foo分支。

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

SubGit 3.0 更新:

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

  1. 没有树干,没有树枝,没有标签,也没有架子:

    [svn]
        url = http://host.com/repos/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 版本。

希望有帮助。

于 2013-05-16T15:17:24.053 回答