是否可以让一个具有多个目录的subversion服务器用于分支,每个分支都映射为使用git-svn创建的git存储库中的远程数据库?
http://svn.example.com/trunk
http://svn.example.com/developers/luisgo/branches
http://svn.example.com/developers/luisgo/tags
http://svn.example.com/teams/scrum-01/branches
http://svn.example.com/teams/scrum-01/tags
http://svn.example.com/branches
http://svn.example.com/releases
这是遗留问题,并且正在迁移到git但是我试图证明我们可以使用git-svn并且有:
请注意,如果我的遥控器名称必须是personal/branches
,personal/tags
,scrum/branches
,scrum/tags
,company/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:如果没有在正确的地方发布,我很抱歉。我很乐意搬家。不需要火焰。
答案 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服务器上创建分支时增加的复杂性。