gpt4 book ai didi

git - 在 git-svn 中克隆主干后克隆分支的最佳方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 13:23:30 25 4
gpt4 key购买 nike

鉴于一个包含许多分支的大型 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. pull 入分支 playground 的修订版 23456

    $ git svn fetch -r 23456

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

    $ git checkout -b Playground 分支/ 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:我还看到有人在现有的 Remote 中添加了一个新的 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,但我真的很想知道最合适的方法。

最佳答案

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

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

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

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

  • 您的 Git 存储库仅包含 git svn 提取的主干。
  • 某人从主干创建了 playground 分支,在该分支中进行了一些提交,然后将 playground merge 到主干。
  • 你使用 git svn 获取主干;它看到 merge ,但对 playground 分支一无所知,将其作为常规提交添加到 Git 存储库。

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

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

关于git - 在 git-svn 中克隆主干后克隆分支的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15385813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com