将特定的 SVN 分支迁移到 GIT(2018 年迁移的主干)

Migrating specific SVN branches to GIT (trunk migrated in 2018)

我有一个 SVN 存储库,它在 2018 年的某个时候部分迁移到了 GIT (Bitbucket)。 SVN 和 GIT 存储库都在使用中。在 SVN 端,主要是旧项目的分支。 GIT 存储库用于 trunk/master 开发。 现在我被要求将剩余的分支从 SVN 迁移到 GIT。问题是我不知道原来的转换是如何完成的(做这件事的人离开了公司)。我可以轻松地将 SVN 存储库转换为 GIT,但我永远无法将其置于提交 ID 实际匹配的状态。 目前让我最接近的方法似乎是

git svn clone -T trunk URL --no-minimize-url --no-metadata -r1:10 --preserve-empty-dirs 

我只在少数几个版本中使用了 -r,因此速度更快。 作者实际上收到了相同的电子邮件 (name@UUID),并且 UUID 与 2018 年转换的 git repo 匹配。 问题似乎是 SVN 历史记录以 2 个提交开始,这些提交仅包含文件夹和提交消息 - 这些提交对我来说被忽略了,但不知何故对于较旧的迁移,它们导致 git 提交仅包含消息。

示例:

svn

commit A: create dir 1

commit B: create dir 2

commit C: create some files in dir 1 and 2

原始git迁移结果:

commit A: commit message only

commit B: commit message only

commit C: create some files in dir 1 and 2

我目前使用 git svn 的努力:

commit C: create some files in dir 1 and 2

尝试使用 SubGit:

subgit import --trunk trunk --username user --svn-url URL)
commit A: commit message only (modified with notes)

commit B: commit message only (modified with notes)

commit C: create some files in dir 1 and 2 (commit message modified with notes)

关于 SubGit 的注释 - 这种方法非常接近(根据文档,我很确定我可以修复提交消息)。 我的问题是,如果我不提供作者文件而不是以 'user@uuid' 结尾,我将以 'user@localdomain' 结尾。 可能的解决方法是提供从原始迁移中导出作者并将其作为作者文件提供?

有人对如何执行此操作有任何建议吗? 如果我无法在 git 端获得相同的提交 ID,如果我能找到共同的祖先(即使 ID 不匹配),是否有一些理智的方式“合并”两个 git 存储库?

您可能会考虑创建一个 单独的 svn 存储库克隆,该克隆从您这次要克隆的最旧分支开始的修订之前的修订开始,并且您只克隆您关心的分支.... 然后 您可以将这些修订移动到其他分支所在的另一个 git 存储库(使用补丁或使用可以访问的存储库两个 git repos 作为遥控器)...如果您使用与基础相同的修订版,git 应用来自新克隆的修订版应该没有任何问题....我接受我过度简化了很多,你可能会得到一些极端情况,但基本逻辑是合理的。

这是默认的 SubGit 行为——如果没有给它一个作者映射(或者如果没有找到与 SVN 用户名匹配的情况)那么它会生成一个 Git 身份使用 SVN 用户名和默认域(由 core.defaultDomain SubGit 配置设置或 default-domain 命令选项设置)。因此,如果您需要 SubGit 为给定的提交设置某些 Git 用户身份,那么为它提供作者映射文件确实更好。如果可以使用“作者文件”命令选项来完成(您可能知道,但仍然:))

subgit import --trunk trunk --username user --authors-file <AUTHORS_FILE_PATH> --svn-url URL

我没有完全理解提交消息有什么问题,假设 Git 中的提交消息与 SVN 中的不匹配?如果是,那么这也可以用SubGit,但不能用subgit import单行,它需要导入初步配置和配置文件编辑。因此,首先 运行 以下命令准备一个 Git 存储库以供导入:

subgit configure --snv-url URL <GIT_REPO>

其中 GIT_REPO 是用于导入的新 Git 存储库的路径。 存储库准备好后,编辑 GIT_REPO/subgit/config 文件,根据需要设置 core.defaultDomaincore.authorsFile,在 [svn] 部分设置正确的映射,并使用 [= 配置所需的提交消息18=] 设置,这里有一些关于此设置的更多详细信息:

https://subgit.com/documentation/config-options.html#svn.gitCommitMessage

设置配置文件后,可以使用短命令开始导入:

subgit import GIT_REPO

至于 Git 提交注释 -- SubGit 总是创建注释,但它们不影响提交 SHA1,因此注释不需要任何操作。 请注意,顺便说一下,作者和提交消息并不是唯一可能影响提交 SHA1 的设置,还有像 'svn.excludePath` 或 'translate.createEmptyGitCommits'.

这样的设置