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

时间:2021-07-15 11:04:10

标签: git svn migration git-svn

我有一个 SVN 存储库,它在 2018 年的某个时候部分迁移到了 GIT(Bitbucket)。 SVN 和 GIT 存储库都在使用中。在 SVN 方面,主要是旧项目的分支。 GIT 存储库用于主干/主开发。 现在我被要求将剩余的分支从 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 存储库?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

subgit configure --snv-url URL <GIT_REPO>

其中 GIT_REPO 是用于导入的新 Git 存储库的路径。 准备好存储库后,编辑 GIT_REPO/subgit/config 文件,根据需要设置 core.defaultDomaincore.authorsFile,在 [svn] 部分设置正确的映射,并使用 {{ 1}} 设置,以下是有关此设置的更多详细信息:

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

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

svn.gitCommitMessage

至于 Git 提交注释——SubGit 始终创建注释,但它们不影响提交 SHA1,因此不需要对注释执行任何操作。 请注意,顺便提一下,作者和提交消息并不是唯一可能影响提交 SHA1 的设置,还有诸如“svn.excludePath”或“translate.createEmptyGitCommits”之类的设置。