使用git-svn克隆了trunk后,克隆分支的最佳方法是什么?

5

假设有一个包含许多分支的大型Subversion仓库,我想通过首先克隆trunk并稍后添加特定分支来开始使用git-svn。 我看到了至少三种方法来做到这一点,但是它们中有哪些是“官方”的或者是否有最佳方法?

假设以下布局:

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

因此,要克隆项目core的主干(无分支)版本12345:
$ 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. 拉取分支playground的第23456个修订版本:

    $ 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

我不确定那是否正确或者它能否生效。我找不到我看到它的地方。


目前,我会坚持选项1,但我真的想知道最恰当的做法。


为什么你不立即克隆所有的分支呢? - Chronial
1
因为该仓库的大小超过5GB,且至少有一百个分支。 - Andrey
1个回答

4
所有您提到的选项都是有效的,并没有一个“标准”的方法来做这件事,部分原因是(从 git svn 的角度来看)没有一个标准的布置 Subversion 存储库的方式。
您选择的选项1和3本质上是等效的。个人而言,我会选择选项3,但结果与您的选项1相同。
选项2可以工作,但它将阻止 Git 检测跨分支的提交历史记录 - Git 通常会尝试检测合并或创建分支的 Subversion 提交,并在 Git 提交中记录这些提交,但如果它将两个分支视为完全独立的存储库,则无法执行此操作。
话虽如此,仅在以后添加新分支会失去很多历史记录。考虑以下流程:
- 您的 Git 存储库仅包含 trunk 的 git svn 拉取。 - 有人从 trunk 创建 playground 分支,在该分支上进行了一些提交,然后将 playground 合并到 trunk 中。 - 您使用 git svn 拉取 trunk;它看到合并,但不知道 playground 分支的任何信息,因此将其添加到 Git 存储库作为常规提交。
如果一直选择 playground 分支,Git 就会检测到该分支和合并,并将它们记录为这样的记录。稍后添加 playground 分支将没有帮助,除非您使用 git svn reset 重新拉取所有提交,因为 git svn 不会重写旧的提交以记录合并。
我的做法是像 Chronial 在评论中建议的那样立即克隆所有分支。这是一个缓慢的过程(我曾经使用100,000次提交的 Subversion 存储库和近300个分支和标签进行此操作),可能需要几天才能完成,但您可以将其留在后台运行,完成后您将拥有完整的 Subversion 历史记录。

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