我的团队正准备迁移到Git,我们想从一个小型存储库开始。 由于二进制文件和数百个版本分支,git-svn创建的初始Git存储库大约10GB。
清理大文件很容易,棘手的部分似乎是分支的数量。
对于git迁移,我们希望在某个时间点(X)开始,只有某些(最新的)分支。 我们没有“主干” - 而是在较长时间内维护的不同版本分支:
---- Version 1 ------------------------
\---------- Version 2--------------
\--------- Version 3----
我很容易发现如何从历史中清除大blob(BFG,git filter-branch)。
我的问题:
除了一些特定的从历史记录之外,我们如何删除所有分支,以便我们只在新鲜的存储库中分支“版本3”?理想情况下,我们希望历史记录从创建此分支的开始提交开始:
--------- Version 3----
有没有办法用git filter-branch
或其他可能性来做到这一点?
答案 0 :(得分:3)
将整个存储库导入Git,然后丢弃您不感兴趣的分支。
扔掉的部分将是一个有趣的部分:D我们如何将它们扔掉并从回购历史中消除它们?
嗯,Git的工作方式,分支只是指向存储库历史记录中提交的指针。存在分支,因为存在指向它们的那些指针。如果删除指针,分支就会消失。如果没有其他任何内容指向这些提交,则提交基本上会从存储库中删除。
现在在分支旁边,还有另一个突出的事情,通常指向提交并保持周围:较新的提交取决于它们。 Git的历史记录是一个很大的非循环树,其中每个提交都有它指向的父提交。通过这种方式,即使没有任何分支明确地指向它们,旧的提交仍然存在;而且,整个历史都有效。
因此,如果您想要删除整行提交(单独的分支),并且这些提交在某些时候没有合并到另一个分支,那么您需要做的就是从存储库中删除分支。然后,没有任何东西会指向提交行,当你垃圾收集存储库时它们将被删除:
git branch -D Version_1
git branch -D Version_2
git gc --prune=now
这将强制删除存储库中的分支Version_1
和Version_2
,然后运行垃圾收集,从存储库中删除没有指向它的指针的每个对象。
之后,您将获得Version_3
的完整历史记录,包括其历史记录中其他两个版本的部分。如果您也想删除它,可以应用this question中说明的方法删除版本3分支点之前的旧历史记录。
答案 1 :(得分:2)
我知道这已经晚了好几年了,但是如果有人在寻找答案来选择一些不涉及克隆整个事情的分支:
使用文件夹tmp
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
更多信息: