使用Git-Svn克隆非标准Svn仓库

40

我对Git相对较新,但在家里使用它非常容易,所以我想在工作中也使用它,我们的项目存储在Svn存储库中。不幸的是,这些存储库略微不标准,并且我无法将它们克隆下来。当然,它们都有trunk、branches/和tags/,但是在到达真正的项目目录之前,branches/和tags/还有子目录:

trunk/
branches/maintenance/release1
branches/maintenance/release2
...
branches/development/feature1
branches/development/feature2
...
tags/build/build1
tags/build/build2
...
tags/release/release1
tags/release/release2

克隆之后:

$ git svn clone -s --prefix=svn/ https://mydomain.com/svnproject
$ git branch -r
  development
  development@1340
  maintenance
  maintenance@1340
  tags/build
  tags/build@1340
  tags/release
  tags/release@1340
  trunk
  trunk@1340 
我没有获得实际项目分支或标签。我实际上需要能够在主干,一个维护分支和一个开发分支中工作。除了对配置进行修改的一些尝试之外,我尝试了这种方法以及几种黑客技巧,但对我来说都无效。
是否有任何方法可以将我非标准的Svn项目的关键组件放入本地git存储库中,以便我可以轻松地在它们之间移动?
非常感谢。
更新:我应该补充说明,我不能完全切换到Git(尚未)。还涉及其他团队成员和国际存在。转换的后勤工作超出了我愿意承担的范围,直到我对Git更加熟悉为止;正如我提到的,我仍然很新,几乎只是探索了它的功能表面。
3个回答

38

Lee B说得对。在#git中,doener提供的答案是将Git升级到1.6.x(我之前使用的是1.5.x)。1.6.x提供了深度克隆功能,因此可以使用多个通配符来使用--branches选项:

$ git svn clone https://svn.myrepos.com/myproject web-self-serve \ 
          --trunk=trunk --branches=branches/*/* --prefix=svn/
$ git branch -r
  svn/development/sandbox1
  svn/development/feature1
  svn/development/sandbox2
  svn/development/sandbox3
  svn/development/model-associations
  svn/maintenance/version1.0.0
  svn/trunk

正是我所需要的。感谢大家的见解。


16

你可以尝试使用 nirvdrum的svn2git(似乎是最新的)来将你的svn导入到git仓库中。
(早在2009年,Paul提到了这个iteman的svn2git取代了这个原始的jcoglan的svn2git,因为其作者曾经称之为“一个快速的hack来从Subversion中获取我的代码”)

它比git svn clone更好,因为如果你的svn中有这样的代码:

  trunk
    ...
  branches
    1.x
    2.x
  tags
    1.0.0
    1.0.1
    1.0.2
    1.1.0
    2.0.0

git-svn会遍历提交历史记录以构建新的git存储库。
将所有分支和标签作为远程svn分支导入,而您真正想要的是git本地分支和git标签对象
因此,在导入此项目后,您将获得:

  $ git branch
  * master
  $ git branch -a
  * master
    1.x
    2.x
    tags/1.0.0
    tags/1.0.1
    tags/1.0.2
    tags/1.1.0
    tags/2.0.0
    trunk
  $ git tag -l
  [ empty ]

当 svn2git 完成您的项目后,您会得到以下结果:

  $ git branch
  * master
    1.x
    2.x
  $ git tag -l
    1.0.0
    1.0.1
    1.0.2
    1.1.0
    2.0.0

当然,这个解决方案并不是单向行驶。

你可以随时返回svn仓库,使用... git2svn(也在那里

思路依旧:

  • 在工作中使用SVN作为中央仓库。

  • 在Git“其他地方”快速实验多个Git私有分支。

  • 仅导入已合并的Git分支到官方SVN分支中。


我在另一篇与我的问题类似的帖子上看到了这条评论。不幸的是,我认为这不会起作用(尽管我肯定会仔细研究svn2git)。我需要直接与Svn repos进行交互。还有其他团队成员还没有准备好使用Git。 - Rob Wilkerson
+1 - 当我正在学习git时,我遇到了类似的问题,直到我使用svn2git设置了一个新的仓库,问题才得以解决。更加最新的版本可以在http://github.com/iteman/svn2git/tree/master找到。 - Paul
@VonC - 如果由于网络不可用而中断克隆,如何重新启动克隆? - notionquest
@notionquest 七年后,我不太确定我是如何处理的(我认为当时我没有遇到这个问题):最好提出一个新问题,并注明使用的 SVN、Git、svn2git 和操作系统的确切版本。 - VonC
创建了一个新问题 http://stackoverflow.com/questions/39751091/nirvdrum-svn2git-fetch-from-interrupted-clone - notionquest
显示剩余2条评论

9

针对不适用普通通配符的仓库布局(从我的回答这个相关问题):

当前 git-svn 手册 表示:

也可以通过在花括号内使用逗号分隔的名称列表来获取一部分分支或标签。例如:

[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/*

我按照您的步骤进行了操作,并成功迁移了1个标签。我想重复同样的步骤来迁移接下来的几个标签。我尝试添加第三个标签{1.0,2.0,3.0}并执行git svn fetch,但是它没有从repo中获取任何内容。我是否漏掉了什么? - notionquest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接