有没有办法将提交历史从SVN存储库合并到Git分支?

时间:2013-05-14 17:57:13

标签: git version-control git-svn version-control-migration

我们目前有几个小的半相关的SVN回购,就提交而言是不活跃的。但是,它们偶尔需要使用和/或需要审查其提交历史记录。我们希望将它们全部转移到一个预先存在的Git仓库中,因为我们的大部分工作都是在Git上完成的......

在做研究时,我认为我想要实现的是为每个拥有所有提交历史的SVN仓库设置一个Git子树分支。但是,git-svn似乎只允许我将1个SVN repo与1个Git repo联系起来,所以我必须首先为每个项目创建一个git repo,然后在最终的repo中转换为子树。 (我认为)

有没有办法将SVN repo中的历史直接合并到我的Git存储库中的分支上,这样我才能有效地跳过创建冗余Git存储库的步骤?

2 个答案:

答案 0 :(得分:1)

git中的一切都比较容易。我使用像git2svn这样的工具将Subversion存储库导入git。

一旦进入git,您就可以设置一个带分支的新存储库。您可以设置每个分支以跟踪一个转换后的Subversion存储库。获取更改集后,您可以使用git remote remove清除远程跟踪。这将为您提供一个存储库,其中包含来自分支上的Subversion的各种更改集。

答案 1 :(得分:0)

因此,我想避免额外存储库的原因是我们使用GitHub来存储我们的存储库,而我需要创建的额外存储库会使我们超出当前计划的限制。

因此,我发现,技巧是将所有存储库保持在本地。我知道这是一种可能性,但不确定如何引用本地存储库。事实证明这不可能更容易!以下是我经历的步骤:

对于每个SVN存储库:

git svn clone http://svnhost.com/path/to/svn/repo

这将创建一个本地Git仓库,其中包含SVN的所有历史记录(甚至保留时间戳!!)。接下来,转到要将其合并到的仓库。创建一个分支,并从以下代码中提取代码:

git checkout -b newsvnbranch1
git pull path_to_newsvnbranch1_git_repo

现在,剩下的步骤不是原始问题的一部分,但它们是我需要完成的最终目标 - 所有SVN存储库和历史记录合并在一起,但是在它们自己的目录中。

git mv trunk newname1
git checkout master
git merge newsvnbranch1

为每个SVN repo完成这些步骤基本上会使您的原始Git仓库具有以下结构:

original
|-newname1  (containing the contents of the first SVN repo)
|-newname2  (containing the contents of the second SVN repo)
|-newname3  (and so on...)

而且,git log现在将显示每个回购交织的历史记录。