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



我有一个SVN回购,在2018年的某个时候部分迁移到了GIT(Bitbucket(。SVN和GIT回购都在使用中。在SVN方面,大多数分支用于旧项目。GIT回购用于主干/主干开发。现在我被要求将剩下的分支从SVN迁移到GIT。问题是,我不知道最初的转换是如何完成的(完成转换的人离开了公司(。我可以很容易地将SVN repo转换为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不匹配(,我会得到两位数的回复吗?

这是默认的SubGit行为——如果没有给它一个作者映射(或者如果找不到与SVN用户名匹配的用户名(,那么它会使用SVN用户名和默认域(由core.defaultDomain SubGit配置设置或default-domain命令选项设置(生成Git标识。因此,如果您需要SubGit为给定的提交设置特定的Git用户标识,那么最好为其提供一个authors映射文件。如果可以用";作者文件";命令选项(您可能知道,但仍然:(

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]部分设置正确的映射,并使用svn.gitCommitMessage设置配置所需的提交消息,以下是有关此设置的更多详细信息:

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

设置配置文件后,可以使用以下短命令启动导入:

subgit import GIT_REPO

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

您可以考虑创建svn repo的单独的克隆,该克隆从您要克隆的最旧分支的修订版之前的修订版开始,并且您只克隆您关心的分支然后您可以将这些修订移到其他分支所在的另一个git repo上(使用补丁或使用可以作为远程访问两个git repo的repo(。。。。如果使用与基本版本相同的修订版,git在应用新克隆中的修订版时应该不会有任何问题。。。。我承认我过于简单化了,你可能会得到一些角落的案例,但基本逻辑是合理的。

最新更新