2

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

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

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

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

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

我的问题:

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

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

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

4

2 回答 2

3

将整个仓库导入到 Git 中,然后扔掉你不感兴趣的分支。

丢弃部分将是有趣的部分:D 我们如何将它们丢弃并从回购历史中根除它们?

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

现在除了分支之外,还有另一个突出的东西通常指向提交并保持周围:更新的提交取决于它们。Git 的历史是一个大的无环树,其中每个提交都有它指向的父提交。这样,即使没有分支明确指向旧提交,旧提交也会保留;这样,整个历史就起作用了。

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

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

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

之后,您将获得 的完整历史记录Version_3,包括其他两个版本中属于其历史记录的部分。如果您也想删除它,您可以应用此问题中解释的方法来删除版本 3 分支点之前的旧历史记录。

于 2014-10-27T14:25:09.953 回答
3

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

使用文件夹中的 SVN URL 初始化 git repotmp

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

更多信息:

于 2017-05-31T20:30:59.177 回答