SVN 到 Git 奇怪分支的迁移

SVN to Git Migration with Weird Branching

我正在使用 KDE svn-all-fast-export 将丑陋的 22GB SVN 存储库迁移到 git。老维护者做了一些非常奇怪的分支。我 运行 遇到需要为单个提交创建 2 个分支的情况。

树看起来像这样

trunk
branch/lots-of_branches
tags/lots_of_tags

目前一切顺利...

现在有人创建了一个名为 'new' 的新文件夹,方法是将顶级标签和分支文件夹复制(svn 复制)到 'new' 中。我不确定如何创建顶级分支和标签文件夹以及如何创建子文件夹。

我的规则如下:

match /branch/([^/]+)/
  repository myrepo
  branch legacy/branch/
end match

match /tags/([^/]+)/
  repository myrepo
  annotated true
  branch refs/tags/legacy/
end match

这导致许多分支称为 legacy/branch/branch_name,但对于上述情况没有 legacy/branch。我的问题是,有没有办法为每个分支创建一个分支,并且还有另一个分支在每次修改分支文件夹时更新?

你可以通过符号引用来中途...

git symbolic-ref refs/heads/legacy-another-foo refs/heads/legacy-foo

请记住,如果您检查引用 git 将不会报告它的符号名称。 所以在 git checkout legacy-another-foo 之后,git status 会报告你在 legacy-foo

你能不能只过滤掉旧文件夹而不导入它?

对不起你的先辈'creative'

pure git-svn 的术语中,您可以告诉可以找到标签和分支的多个位置。您将为分支设置 2 个位置(一个在分支中,另一个在 new/branch 中)和两个标签位置(一个在标签中,另一个在 new/tags 中)。

@thekbb 好主意,但我正在努力维护历史。我最近的测试是 运行 当前的规则集,直到它消失,然后重新 运行 导入器使用不同的集来生成顶级引用。

第二套规则:

match /branch/
  repository myrepo
  branch legacy/branch
end match

match /tags/
  repository myrepo
  branch legacy/tags
end

之后我会在一次提交后恢复第一组结果

++++++++++++++++++ 更新 ++++++++++++++++++
这奏效了。第二遍比第一遍快,因为它忽略了除了涉及 /branch 或 /tags 的提交之外的所有内容。