39

我对 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 更加熟悉为止;正如我所提到的,我还是很新。我几乎没有触及它功能的表面。

4

3 回答 3

38

李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

正是我需要的。感谢您的洞察力,所有。

于 2009-02-21T19:40:00.150 回答
14

您可以尝试nirvdrum 的 svn2git(似乎是最新的)以便将您的 svn 导入 git 存储库吗?
(2009 年初,Paul提到了这个iteman 的 svn2git来代替原来的 jcoglan 的 svn2git,正如他的作者所说:“一个快速的破解让我的代码脱离 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 repo。
它将所有分支和标签导入为远程 svn 分支,而您真正想要的是 git-native 本地分支和 git tag objects
所以在导入这个项目后,你会得到:

  $ 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 分支中

于 2009-02-21T12:31:48.947 回答
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/*
于 2011-05-23T23:58:40.480 回答