3

是否可以有一个带有多个分支目录的单一颠覆服务器,每个分支都映射为使用 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 并拥有:

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

personal/branches请注意,如果我的遥控器的名称必须分别为、personal/tagsscrum/branches、和scrum/tags,我不介意。company/branchescompany/tags

最终,我希望能够从主干(又名公司/主服务器)创建一个分支,该分支不仅是本地的,而且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

本质上personalscrumcompany是在同一个 svn 服务器中具有不同分支/* 的遥控器。

当我尝试这样做时:

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

它告诉我我需要解决一个模棱两可的设置,其中我为多个遥控器指定了相同的 url。我知道是这样,但它们确实共享一个树干。

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

有任何想法吗?这甚至可能吗?

谢谢,

路易斯

PS:如果没有在正确的地方发布,我深表歉意。我很乐意移动它。没必要发火。

4

1 回答 1

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
    

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

  • 例如,为每个存储库分别获取主干,因此“公司”远程将具有该行fetch = trunk:refs/remotes/company/trunk

    这意味着您将为每个存储库重复一些获取操作,但这意味着您将获得正确的合并和分支历史记录的最佳机会,因为 Git 将了解主干(以及因此从/合并到主干的分支)您所有的存储库。

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

也就是说,您所使用的命令(例如git push scrum feature-branch,推送到teams/scrum-01/branches/feature-branch)永远不会起作用 - 您需要使用git svn命令,例如git svn branch -R scrum feature-branch, 然后git svn dcommit在检出 feature-branch 时。

不过,我个人会推荐您的原始配置:这是最简单的选项,这意味着您永远不会多次获取提交,并且 Git 将能够尽其所能地跟踪分支和合并操作。

使用您的原始配置,您需要指定-d而不是-Rto git svn branch,例如git svn branch -d teams/scrum-01/branches feature-branch,我承认这有点复杂,但是一旦创建了分支,推送到它是完全相同的git svn dcommit:增加的配置简单性,以及 Git 跟踪完整合并和分支历史的能力,足以弥补在 Subversion 服务器上创建分支时增加的复杂性。

于 2013-03-20T14:02:21.933 回答