我们公司的subversion repo有点棘手:我们有一个基本的“默认”布局,包括主干,标签和分支。但是,在分支内部,我们有一个“工作”目录,其中包含更多分支。像这样:
现在我如何让git-svn将所有这些(以及更多)识别为单独的分支?看起来git svn init
只接受一个分支位置,我怎么调用它。
编辑:这是我初始化git repo的方式:
git svn clone -s --prefix=svn/ http://svn.company.com/product/
答案 0 :(得分:28)
您可以在git-svn配置中添加多个分支和标签条目,甚至可以追溯。因此,如果SVN分支中的SVN分支通常位于branches/*
中(即标准布局),但您也有branches/summer-students/*
,则可以在.git/config
中进行设置,如下所示:
[svn-remote "svn"]
url = svn+ssh://svn.example.com
fetch = trunk:refs/remotes/trunk
branches = branches/*:refs/remotes/*
tags = tags/*:refs/remotes/tags/*
branches = branches/summer-students/*:refs/remotes/svn-summer-students/*
在:
左侧是SVN Repo中的路径,右侧是在git远程分支列表中显示的路径。您可以反复使用refs/remotes/*
将所有内容显示为顶级远程分支,但要注意名称冲突 - 它们会破坏事物(因此svn-summer-students
而不是summer-students
已经存在)。
编辑配置后,您需要删除.git/svn/.metadata
并运行git svn fetch
以刷新分支列表并重新生成它。然后git branch -r
应显示额外的分支。如果出现错误,请注意命名冲突。
如果你有一个时髦的SVN布局,git svn docs还有一些通过通配符或表达式指定路径的例子。
答案 1 :(得分:12)
对于那些希望追溯执行此操作的人,git-svn manpage for 1.7.x说:
也可以获取子集 分支或标签使用 以逗号分隔的名称列表 括号。例如:
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
branches = branches/{red,green}/src:refs/remotes/branches/*
tags = tags/{1.0,2.0}/src:refs/remotes/tags/*
答案 2 :(得分:10)
根据another question的答案,您最好的选择是使用Git 1.6.x并利用“深度克隆”。
如果无法升级到1.6.x,则可以在克隆时指定多个分支。
git svn clone -s --prefix=svn/ -b branches -b branches/work/dave -b branches/work/tom ...
在添加新用户分支时,您必须确保在“git svn fetch”之前将新用户的信息添加到.git / config。