SVN to Git migration:仅导入某些分支和历史记录

时间:2014-10-27 14:08:22

标签: git svn version-control git-rewrite-history

我的团队正准备迁移到Git,我们想从一个小型存储库开始。 由于二进制文件和数百个版本分支,git-svn创建的初始Git存储库大约10GB。

清理大文件很容易,棘手的部分似乎是分支的数量。

对于git迁移,我们希望在某个时间点(X)开始,只有某些(最新的)分支。 我们没有“主干” - 而是在较长时间内维护的不同版本分支:

 ---- Version 1 ------------------------
     \---------- Version 2--------------
                \--------- Version 3----

我很容易发现如何从历史中清除大blob(BFG,git filter-branch)。

我的问题:

除了一些特定的从历史记录之外,我们如何删除所有分支,以便我们只在新鲜的存储库中分支“版本3”?理想情况下,我们希望历史记录从创建此分支的开始提交开始:

 --------- Version 3----

有没有办法用git filter-branch或其他可能性来做到这一点?

2 个答案:

答案 0 :(得分:3)

将整个存储库导入Git,然后丢弃您不感兴趣的分支。

  扔掉的部分将是一个有趣的部分:D我们如何将它们扔掉并从回购历史中消除它们?

嗯,Git的工作方式,分支只是指向存储库历史记录中提交的指针。存在分支,因为存在指向它们的那些指针。如果删除指针,分支就会消失。如果没有其他任何内容指向这些提交,则提交基本上会从存储库中删除。

现在在分支旁边,还有另一个突出的事情,通常指向提交并保持周围:较新的提交取决于它们。 Git的历史记录是一个很大的非循环树,其中每个提交都有它指向的父提交。通过这种方式,即使没有任何分支明确地指向它们,旧的提交仍然存在;而且,整个历史都有效。

因此,如果您想要删除整行提交(单独的分支),并且这些提交在某些时候没有合并到另一个分支,那么您需要做的就是从存储库中删除分支。然后,没有任何东西会指向提交行,当你垃圾收集存储库时它们将被删除:

git branch -D Version_1
git branch -D Version_2
git gc --prune=now

这将强制删除存储库中的分支Version_1Version_2,然后运行垃圾收集,从存储库中删除没有指向它的指针的每个对象。

之后,您将获得Version_3的完整历史记录,包括其历史记录中其他两个版本的部分。如果您也想删除它,可以应用this question中说明的方法删除版本3分支点之前的旧历史记录。

答案 1 :(得分:2)

我知道这已经晚了好几年了,但是如果有人在寻找答案来选择一些不涉及克隆整个事情的分支:

使用文件夹tmp

中的SVN URL初始化git repo
git svn init -T <main_branch_name> <repo_url> tmp

更新'.git / config'文件以仅克隆特定分支。 在这种情况下,我们将仅克隆与模式feature*

匹配的分支
[svn-remote "svn"]
   noMetadata = 1
   url = <repo_url>
   fetch = trunk:refs/remotes/origin/trunk
   branches = branches/feature*:refs/remotes/origin/*  ## Added line

现在您可以从SVN存储库中获取文件

git svn fetch -r $NUMBER:HEAD

更多信息: