5

鉴于有许多分支的大型 Subversion 存储库,我想git-svn通过先克隆trunk并稍后添加特定分支来开始使用。我至少看到了三种方法来做到这一点,但它们中的任何一种都是“官方的”还是有最好的方法?

假设以下布局:

https://svn-repo.com/svn/company
   +--core
   |  +--trunk
   |  +--branches
   |  |  +--fastboot
   |  |  +--playground
   |  +-tags
   +--mobile
      +--trunk
      +--branches
      +--tags

因此,仅克隆项目的主干(无分支)修订版 12345 core

$ git svn clone --username=svnuser -r 12345 -Ttrunk https://svn-repo.com/svn/company/core

这会将项目克隆core到同名目录中,并且运行git svn rebase将拉入所有更改(修订版 12345 之后)。此时.git/config应该有这样的东西:

[svn-remote "svn"]
  url = https://svn-repo.com/svn/company
  fetch = core/trunk:refs/remotes/trunk

到目前为止,一切都很好。现在,假设我要添加playground分支。这是它变得有点朦胧的地方。


选项 1.git/config :通过在其中添加分支来更新现有远程:

[svn-remote "svn"]
  url = https://svn-repo.com/svn/company
  fetch = core/trunk:refs/remotes/trunk
  branches = core/branches/{playground}:refs/remotes/branches/*

在这一点上,我能够做到:

  1. 拉入分支的修订版 23456playground

    $ git svn fetch -r 23456

  2. 创建一个本地分支并切换到它

    $ git checkout -b playground branches/playground

  3. 拉入最新更改:

    $ git svn rebase


选项2:添加一个新的遥控器.git/config(除了现有的):

[svn-remote "playground"]
  url = https://svn-repo.com/svn/company
  fetch = core/branches/playground:refs/remotes/playground

从这里开始,步骤类似于选项 1中的步骤:

$ git svn fetch playground -r 23456
$ git checkout -b playground remotes/playground
$ git svn rebase

选项 3:我还看到有人在现有遥控器中添加了新的 fetch:

[svn-remote "svn"]
  url = https://svn-repo.com/svn/company
  fetch = core/trunk:refs/remotes/trunk
  fetch = core/branches/playground:refs/remotes/branches/playground

我不完全确定这是否正确,或者它是否会起作用。我找不到我在哪里看到的。


目前,我坚持使用Option 1,但我真的很想知道最合适的方法。

4

1 回答 1

4

您注意到的所有选项都是有效的,并且没有一种“规范”的方式可以做到这一点,部分原因是(从git svn's 的角度来看)没有一种规范的方式来布置 Subversion 存储库。

您选择的选项 1 和 3 基本上是等效的。就个人而言,我会选择选项 3,但结果将与您的选项 1 相同。

选项 2 会起作用,但它会阻止 Git 检测跨分支的提交历史记录——Git 通常会尝试检测合并或创建分支的 Subversion 提交,并在 Git 提交中记录这些提交,但如果它是将两个分支视为完全独立的存储库。

也就是说,通过仅在以后添加新分支,您已经失去了很多历史记录。考虑以下流程:

  • 您的 Git 存储库仅包含git svn主干的提取。
  • 有人从主干创建了操场分支,在该分支中进行了一些提交,然后将操场合并到主干。
  • git svn用来取树干;它看到了合并,但对 Playground 分支一无所知,将其作为常规提交添加到 Git 存储库。

如果你一直在使用 Playground 分支,Git 会检测到该分支并合并,并将它们记录下来。之后添加游乐场分支将无济于事,除非您使用git svn reset重新获取所有提交,因为git svn不会重写旧提交以记录合并。

正如 Chronial 在评论中建议的那样,我所做的是立即克隆所有分支。这是一个缓慢的过程(我已经用 100,000 个提交的 Subversion 存储库完成了这项工作,其中包含近 300 个分支和标签)可能需要几天才能完成,但你可以让它在后台运行,完成后你会拥有完整的 Subversion 历史记录。

于 2013-03-14T14:40:23.080 回答