4

svn 中的标准 repo 布局如下。

/trunk
/branches
    featureX
    featureY
/tags
    1.0
    2.0

我正在使用的存储库是一个更扁平的结构。

trunk
featureX
featureY

本质上,主干与其他分支处于同一水平。因此,我不能使用 -s 或 -b 选项git svn init

我将如何trunk作为 git 分支加入masterfeatureX作为同名 git 分支加入?我不关心任何其他分支或标签。

我见过类似的问题,人们建议重组 svn 存储库。就这个问题而言,这是不可能的。

4

2 回答 2

3

我想出了一种从任意 svn 存储库结构中提取多个分支的方法。

仅当所有分支都在存储库的子目录中组合在一起时,该-b选项git svn init才有效,例如在标准布局中。如果包括树干在内的所有分支并排在同一个文件夹中,这将无法正常工作。您可以通过在您的 git 存储库中创建多个“主干”来从 svn 存储库中提取选定的分支。

假设问题的平面结构具有三个分支树干、featureX 和 featureY。

  1. 实例化您的 git 存储库。

    mkdir myproject
    cd myproject
    git svn init url:to/svn/repo -T trunk
    

    这将在文件中创建一个带有 svn 元数据的 git 存储库.git/config

  2. 打开配置文件并检查 svn 元数据

    vim .git/config
    

    你的配置文件看起来像这样。

    [core]
      repositoryformatversion = 0
      filemode = true
      bare = false
      logallrefupdates = true
      autocrlf = false
    [svn-remote "svn"]
      url = url:to/svn/repo
      fetch = trunk:refs/remotes/trunk
    

    svn-remote头定义了一个名为“svn”的引用,指向您的 svn 存储库。该fetch参数告诉 git-svn 从 svn 存储库中提取新修订的位置。现在我们需要告诉 git-svn 我们感兴趣的另一个分支。

  3. 复制svn-remote部分

    复制配置文件的整个svn-remote部分并将其粘贴到现有配置文本下方。

    [core]
      repositoryformatversion = 0
      filemode = true
      bare = false
      logallrefupdates = true
      autocrlf = false
    [svn-remote "svn"]
      url = url:to/svn/repo
      fetch = trunk:refs/remotes/trunk
    [svn-remote "svn"]
      url = url:to/svn/repo
      fetch = trunk:refs/remotes/trunk
    
  4. 修改新svn-remote部分

    更改svn-remote节标题的名称和它指向的分支的名称。

    [core]
      repositoryformatversion = 0
      filemode = true
      bare = false
      logallrefupdates = true
      autocrlf = false
    [svn-remote "svn"]
      url = url:to/svn/repo
      fetch = trunk:refs/remotes/trunk
    [svn-remote "svn-featureX"]
      url = url:to/svn/repo
      fetch = featureX:refs/remotes/featureX
    

    现在 git-svn 将跟踪两个 svn 分支。您可以将名称“svn”和“svn-featureX”与任何带有[svn-remote]参数的 git-svn 命令一起使用。您可以将名称“trunk”和“featureX”与任何将远程分支名称作为参数的 git 命令一起使用。

该解决方案无法很好地扩展,并且与格式错误的 svn 存储库一起使用有点麻烦。只要您只需要跟踪少数 svn 分支,就可以正常工作。如果您需要使用的 svn 分支数量太大,请认真考虑将您的 svn 存储库重组为标准布局。

于 2010-09-11T16:47:11.100 回答
1

本文所示,您可以编写运行诸如svn2git 之类的导入器工具的规则(此处您的 svn2git
版本不太完整)

请参阅这些示例以了解您可以重写以匹配那些平面 SVN 目录/分支并将它们声明为 Git 分支的规则。

于 2010-09-10T05:36:53.980 回答