git-svn单个svn服务器,多个svn目录作为多个git遥控器

时间:2013-03-18 21:26:10

标签: git svn version-control git-svn

是否可以让一个具有多个目录的subversion服务器用于分支,每个分支都映射为使用git-svn创建的git存储库中的远程数据库?

现有设置

  • 主干:http://svn.example.com/trunk
  • 我的分支:http://svn.example.com/developers/luisgo/branches
  • 我的代码:http://svn.example.com/developers/luisgo/tags
  • 我的Scrum团队的分支机构:http://svn.example.com/teams/scrum-01/branches
  • 我的scrum团队的标签:http://svn.example.com/teams/scrum-01/tags
  • 公司的分支机构:http://svn.example.com/branches
  • 公司代码:http://svn.example.com/releases

这是遗留问题,并且正在迁移到git但是我试图证明我们可以使用git-svn并且有:

  • 一个“个人”远程指向服务器上的个人subversion目录
  • 一个“scrum”远程指向我在服务器上的scrum团队的subversion目录和
  • 一个“公司”远程指向服务器上公司的subversion目录

请注意,如果我的遥控器名称必须是personal/branchespersonal/tagsscrum/branchesscrum/tagscompany/branches和{{},我不介意1}}分别。

最终我希望能够创建一个主干(又名公司/主人)的分支,这不仅是本地的,而是推送到company/tags,之后可以推送到不同的远程(比如{{1} }用于协作并最终推送到personal/branches/some-feature-branch以供发布。请注意,我理解标记,但为了讨论的目的故意省略它。

我认为这样可行:

scrum/branches/some-feature-branch

但事实并非如此。

编辑===========================================

我想我解释错了。从技术上讲,上面的例子可行。我想要实现的是每个分支目录创建一个“远程”,所以:

company/some-feature-branch

结果:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = false
    warnambiguousrefs = false
[svn-remote "svn"]
    url = https://svn.example.com
    fetch = trunk:refs/remotes/trunk
    branches = developers/luisgo/branches/*:refs/remotes/svn/personal/branches/*
    tags = developers/luisgo/tags/*:refs/remotes/svn/personal/tags/*
    branches = teams/scrum-01/branches/*:refs/remotes/svn/scrum/branches/*
    tags = teams/scrum-01/tags/*:refs/remotes/svn/scrum/tags/*
    branches = branches/*:refs/remotes/svn/company/branches/*
    tags = releases/*:refs/remotes/svn/company/tags/*

和...

git push personal feature-branch

结果:

https://svn.example.com/developers/luisgo/branches/feature-branch

和...

git push scrum feature-branch

结果:

https://svn.example.com/teams/scrum-01/branches/feature-branch

本质上git push company feature-branch https://svn.example.com/branches/feature-branch personal是同一个svn服务器中具有不同分支/ *的遥控器。

当我尝试这样做时:

scrum

它告诉我我需要解决一个模糊的设置,其中我为多个遥控器指定了相同的URL。我知道它是,但这些共享一个主干。

结束编辑===========================================

有什么想法吗?这甚至可能吗?

谢谢,

路易斯

PS:如果没有在正确的地方发布,我很抱歉。我很乐意搬家。不需要火焰。

1 个答案:

答案 0 :(得分:1)

Git会很高兴您拥有多个具有相同基本URL(svn-remote.{name}.url设置)的Subversion存储库。问题是,从Git的角度来看,你有多个“存储库”试图进入refs/remotes/trunk,而从一个存储库中提取会覆盖另一个存储库。事实上,在一天结束时他们将是相同的是无关紧要的,因为Git没有真正的方法来确定这一点。

(我将继续引用单独的“存储库”,因为从Git的角度来看,这些是完全独立的存储库;事实上它们实际上是相同的Subversion存储库对Git没有任何区别。)

根据您当前的工作流程,我可以看到两种可能的解决方案:

  • 从配置中删除所有fetch = trunk:refs/remotes/trunk行,因此您只有一个存储库试图进入主干。

    如果你想保持干净,你可以为主干设置一个全新的存储库,如下所示:

    [svn-remote "svn"]
            url = http://svn.example.com
            fetch = trunk:refs/remotes/trunk
    

    然后从其他三个存储库中删除该提取。

  • 为每个存储库单独获取主干,因此“company”遥控器将具有行fetch = trunk:refs/remotes/company/trunk,例如。

    这意味着你将为每个存储库重复一些获取操作,但这意味着你有最好的机会获得正确的合并和分支历史记录,因为Git会知道主干(因此分支来自/合并到在您的所有存储库中。

    但是,Git仍然无法跟踪不同存储库之间的合并和分支,因此,例如,从scrum分支到公司分支的合并将不会被检测到。

    < / LI>

也就是说,你所追求的命令(例如git push scrum feature-branch推送到teams/scrum-01/branches/feature-branch)永远不会工作 - 你需要使用git svn命令,例如{{1}检查功能分支时,然后git svn branch -R scrum feature-branch

我个人推荐你的原始配置:它是最简单的选项,它意味着你永远不会多次获取提交,Git将能够尽最大努力跟踪分支和合并操作。

使用原始配置,您需要将git svn dcommit而不是-d指定为-R,例如git svn branch,我会批准更多复杂,但是一旦创建了分支,推送到它就完全相同:git svn branch -d teams/scrum-01/branches feature-branch。增加的配置简单性以及Git跟踪完整合并和分支历史记录的能力,不仅可以弥补在Subversion服务器上创建分支时增加的复杂性。