如何将非标准svn仓库克隆到git?

5

我尝试将一个svn仓库克隆到git,但有些分支在svn根目录下,如下所示。

我已经尝试了

$ git clone svn://url/svn-root -T trunk -b branches -b branch1 -b branch2

并且

$ git clone svn://url/svn-root -T trunk -b branches -b .

两个都没有成功地克隆branch1branch2。请帮忙。

svn-root
├── branch1
├── branch2
├── branches
│   ├── branch3
│   └── branch4
└── trunk
2个回答

6

GitMinutes第20集中提到了一个有趣的工具——SubGit,它是Atalssian Stash的插件(不是免费的,但你可以试用一下)。
你可以在"GitMinutes#22:Alexander Kitaev谈SubGit"中了解更多关于SubGit的信息。

它被设计来管理非常规的svn仓库布局。

http://subgit.com/img/stash/105_repository_layout.png

Dmitry Pavlenko 评论道

你应该在“分支”字段中输入:

*:refs/heads/*;branches/*:refs/heads/branches/* 
# instead of 
branches/* 

在这种情况下,branch1将被翻译为refs/heads/branch1
branch3将被翻译为refs/heads/branches/branch3
或者,如果您只有少量的顶级分支,则可以显式枚举它们:
branch1:refs/heads/branch1;
branch2:refs/heads/branch2;
branches/*:refs/heads/bra‌​nches/*

针对您的情况,您应该在“分支”字段中输入 *:refs/heads/*;branches/*:refs/heads/branches/* 而不是 branches/*。这种情况下,branch1 将被转换为 refs/heads/branch1branch3 将被转换为 refs/heads/branches/branch3。或者,如果您只有有限数量的顶级分支,您可以明确列出它们:branch1:refs/heads/branch1;branch2:refs/heads/branch2;branches/*:refs/heads/branches/* - Dmitry Pavlenko
@DmitryPavlenko 很好的观点。我已经将您的评论包含在答案中以增加可见性。 - VonC
我能否通过这种方法让本地的git仓库直接从原始svn仓库接收更新,还是需要将Atalssian作为中转站? - kangshiyin
@Eric 我建议保留Atlassian工具以进行后续更新。 - VonC

0

我想到了两个选项:

  • 首先清理你的SVN仓库(将分支移动到/branches下,这是标准布局所要求的位置)。
  • 使用标准布局进行检出,稍后再添加远程分支引用。

这不是我的svn仓库,所以我不能使用方法1。您能否提供更多关于方法2的细节,特别是“添加远程分支引用”的步骤。我简要阅读了“git help svn”,但没有找到解决方案。 - kangshiyin

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