2014-10-27 220 views
1

我的团队正在准备迁移到Git,我们希望从一个小型存储库开始。 由于二进制文件和数百个版本分支,由git-svn创建的初始Git存储库大约为10GB。SVN迁移到Git:只导入某些分支和历史记录

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

对于git迁移,我们想从某个时间点(X)开始,只有某些(最新的)分支。 我们没有一个“主干” - 但保持在一个较长的时间段,而不是不同的版本分支:

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

我很容易找到如何从历史的清洁大斑点(BFG,git的过滤器 - 科)。

我的问题:

我们怎样去掉所有分支,除了少数特定的人从历史所以,我们只有,比如说分支“版本3”中的新鲜资料库?理想情况下,我们希望历史的开始,在开始提交,其中该分支的创建:

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

有没有办法用git filter-branch或另一种可能可以做到这一点?

+0

导入整个仓库到Git的迁移,然后扔掉你不感兴趣的树枝 – poke 2014-10-27 14:10:29

+0

扔掉的部分将是有趣的:d我们如何将它们扔掉并从回购历史中消除它们? – Patrick 2014-10-27 14:12:04

回答

2

导入整个仓库到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的分支点之前的旧历史。

2

我知道这是几年后,但如果有人正在寻找回答只选择几个分支,不涉及克隆整个事情:

初始化git的回购与文件夹SVN URL的tmp

git svn init -T <main_branch_name> <repo_url> tmp 

更新了“git的/配置”文件来克隆只有特定的分支。 在这种情况下,我们要克隆与模式相匹配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 

的更多信息: