SVN 到 Git 迁移提交历史问题

Posted

技术标签:

【中文标题】SVN 到 Git 迁移提交历史问题【英文标题】:SVN to Git migration Commit history Issue 【发布时间】:2019-01-30 21:15:11 【问题描述】:

我有一个结构糟糕的 SVN 存储库。让我试着给你一张图片。

svn-repo
|
|--branches
|     |
|     |-- project1
|     |-- project2
|     |-- tragetProject
|               |
|               |-- targetProject5.0.0
|               |-- targetProject5.0.1
|               |-- targetProject5.0.2
|               |-- ...
|
|--trunk
      |
      |-- project1
      |-- project2
      |-- ...

我要迁移的项目是“targetProject”。每个分支都来自最新的分支,例如。 5.0.1 是 5.0.0 的一个分支。所以 svn 中的每个分支都有其祖先的提交历史。

这是我尝试迁移到 git 的过程。

git svn init [trargetProject5.0.2 Url]
git svn fetch

我的问题是,虽然 svn 分支有所有提交历史,但在 fetch 之后,在 git local master 中只有这个分支的提交历史,而不是它的祖先的提交历史。

我需要获取所有历史记录。我尝试更改 git config 中的 git 分支 url 以获取每个分支的提交,但这也失败了,因为“git svn rebase”没有按预期工作。我还需要获得在 svn repo 中创建的新分支的新提交。任何人都可以帮助或为我提供一种新的方法来处理这个问题吗?谢谢。

【问题讨论】:

【参考方案1】:

好的,我找到了解决方案。

我不想克隆我庞大的 repo 的主干,而是想克隆某个分支。所以使用这个命令就可以了。

git svn clone -T branches/tragetProject/tragetProject5.0.2 http://example.com/PROJECT

这将克隆当前分支并搜索每个父级以获取所有提交历史记录。

因为我的 svn 存储库很大,并且所有分支都链接在一起,所以这个命令需要很长时间才能完成,并且会从旧分支中获取不需要的提交。通过在末尾添加-r<revision>:HEAD,您可以将克隆调查限制为特定版本。

所以命令变成:

git svn clone -T branches/tragetProject/tragetProject5.0.2 http://example.com/PROJECT -r40000:HEAD

希望这对将来的某人有所帮助。

参考https://gist.github.com/trodrigues/1023167#file-gistfile1-txt-L30

【讨论】:

【参考方案2】:

要在保留所有历史记录的同时将 SVN 迁移到 Git,可以使用以下命令:

git svn clone <svn-repo URL> --branches=branches --tags=tags --trunk=trunk

现在所有的提交历史都保存在 git repo 中。默认只有本地分支master,但你可以通过git branch -r找到其他分支。

git branch -r 命令的输出看起来像origin/branch1。那么你只需要通过git branch -b &lt;local Branch name&gt; &lt;remote branchname&gt;在本地签出所有分支。

如上例,要在本地签出branch1,可以使用命令git checkout -b branch1 origin/branch1

【讨论】:

感谢您的回复..我会试试这个..但这会克隆每个项目对吗?我的问题是 svn 结构不好并且包含许多不同的项目,而我要转移的项目位于 svn 存储库中的分支文件夹下。此外,我要转移的项目对于每个版本都有一个新分支。您是否建议克隆整个 repo,然后创建一个新分支来合并我需要的 svn 分支? @itdoesntwork 你的意思是只克隆某个分支而不是所有分支,然后你可以在--branches 选项中指定它。如--branches=branches\tragetProject

以上是关于SVN 到 Git 迁移提交历史问题的主要内容,如果未能解决你的问题,请参考以下文章

svn迁移至git指南

从 svn 迁移到 github 企业而不丢失提交历史

从SVN历史列出作者,包括已删除(未合并)的分支

SVN和GIT提交历史记录和代码差异

在保留所有历史提交的同时将Git存储库迁移到tfs Git

我可以将单个文件从 CVS 迁移到 SVN 吗?