Git SVN克隆复杂结构

3

我需要将一个SVN仓库克隆到Git。这个SVN仓库的结构就像是一个仓库中包含了多个仓库:

SVNRepo
|____ProjectA
|    |___branches
|    |___tags
|    |___trunk
|            file
|____ProjectB
|    |___branches
|    |___tags
|    |___trunk
             file

我需要克隆存储库,以便最终得到一个单独的git存储库,没有svn特定的文件夹(分支,标签,主干)。我最初将SVN repo转储然后拆分为每个项目的单独repo,并使用带有--stdlayout命令的git svn clone迁移到git。这起初有效,但是由我们的团队否决了并带来了自己的问题。
我尝试了带有--stdlayout命令的git svn clone,但那行不通。我最终获得了一个空的git repo,其中只有2个提交(而非数百个)和没有实际文件。没有错误,所以我不知道发生了什么。
尝试不带--stdlayout的git svn clone在某种程度上可以工作,因为我获得了一个包含所有文件和历史记录的单个git repo。但是,我仍然有所有的分支,标签和主干文件夹,我想要删除它们。
我考虑过转储SVN repo并使用sed编辑二进制文件,但那似乎是很多工作。我想象有人遇到过这个问题并解决了它,但找不到任何有效的方法。
2个回答

0

在git svn的配置中,您可以设置多个主干、分支和标签位置。如果它们是从同一个父级创建的,git-svn会自动识别出来。https://git-scm.com/docs/git-svn


您是在指"您可以指定多个--tags和/或--branches选项"吗?如果是的话,能否请提供一个基本示例? - Tom
如果您想知道如何在git svn init调用中指定它们,那么是的,您可以向存储库提供“基本”URL,然后为_单独_分支(使用--trunk),_分组_分支(使用--branches)和标记提供多个位置。因此,在您的情况下,它应该看起来像:git svn init -T ProjectA/trunk -B ProjectA/branches -t ProjectA/tags -T ProjectB/trunk -b ProjectB/branches -t ProjectB/tags。但现在我在想...它们是同一个项目吗?因为如果不是,那么您应该考虑为每个项目创建一个单独的存储库。 - eftshift0
我想你可以将它们分开,并使用类似于Gradle或Maven的工具将它们绑定在一起(如果使用Java的话...我相信其他语言也有可用的工具)。无论如何,只是详细说明一下。 - eftshift0
现在是时候进行一些非传统的“出奇制胜”的思考了。 :-) - eftshift0
我按照你的建议尝试了,但不幸的是它没有起作用。如果指定了“--trunk”超过一次,则只使用最后一个实例,即在你的示例中,只克隆ProjectB。 - Tom
显示剩余3条评论

0

对于一次性迁移,git-svn 不是转换存储库或存储库部分的正确工具。如果您想将 Git 用作现有 SVN 服务器的前端,则它是一个很好的工具,但对于一次性转换,您不应该使用 git-svn,而应该使用更适合此用例的 svn2git

有许多称为 svn2git 的工具,其中可能最好的是来自https://github.com/svn-all-fast-export/svn2git的 KDE 工具。我强烈建议使用那个 svn2git 工具。这是我知道的最好的工具,并且在您可以使用其规则文件做的事情方面非常灵活。

您将能够轻松配置 svn2git 的规则文件,以从当前的 SVN 布局中产生所需的结果。

如果您对代码库的历史记录不是100%确定,那么http://blog.hartwork.org/?p=763中的svneverever是一个很好的工具,可以在将其迁移到Git时调查SVN代码库的历史记录。

尽管使用git-svn更容易入门,但以下是一些进一步的原因,说明为什么使用KDE的svn2git而不是git-svn更加优越,除了其灵活性之外:

  • 使用正确的svn2git(如果使用正确的工具),可以更好、更干净地重建历史记录,特别是对于包含分支和合并等复杂历史记录的情况。
  • 在Git中,标签是真正的标签,而不是分支。
  • 使用git-svn时,标签包含一个额外的空提交,这也使它们不属于分支的一部分,因此默认情况下只有指向已获取分支的标签才会被获取。除非您给命令加上--tags选项,否则普通的fetch命令将无法获取它们。使用正确的svn2git,标签就在它们应该的位置。
  • 如果您在SVN中更改了布局,可以轻松地使用svn2git进行配置,但使用git-svn最终会丢失历史记录。
  • 使用svn2git,您还可以轻松地将一个SVN存储库拆分为多个Git存储库。
  • 或者将同一SVN根目录中的多个SVN存储库合并为一个Git存储库。
  • 使用正确的svn2git比使用git-svn转换速度快得多。

你看,为什么git-svn不如KDE的svn2git要好,原因有很多。:-)


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