将git存储库中的文件夹拆分为单独的分支

时间:2012-02-12 11:14:37

标签: git git-subtree

我最终将我们的CVS存储库迁移到git。不幸的是,我们没有在CVS中使用分支,但是不同的版本/分支被分成不同的子目录。

即。我们有以下目录结构:

/root
    /lib
    /tools
    /src
        /v1.0
        /v2.0
        /v3.5

有没有办法将src子目录中的3个版本分成不同的分支,而不是保留每个版本的目录?

我在Stack Overflow Question 4877053上找到了同样的问题,其中提出了git-subtree的使用,但即使在阅读git-subtree手册后,我也不明白如何使用它解决我的问题。

有人可以给我一个更详细的解释,甚至是另一种解决方案吗?

我对git很新,也许这就是为什么我不理解子树手册; - )

非常感谢你的所有食物!

1 个答案:

答案 0 :(得分:3)

这取决于您之后想要保留在存储库中的内容。

如果你想要三个分支,v1.0v2.0v3.5,所有分支都是这样的结构:

/root
    /lib
    /tools
    /src

然后是的,我很确定你能做到这一点。在分支结构方面,你最终会得到类似的东西:

-- A -- B -- Current 
              | 
              |--- v1.0
              |--- v2.0
              |--- v3.5
自从您迁移到git以及AB和{{1}之后,

Currentv1.0v2.0提交了您已提交的内容本质上是“死胡同”的分支。如果你想让分支结构更像是:

,你可以做一些奇特的事情
v3.5

即,将-- v1.0 --- v2.0 --- v3.5 -- A -- B -- Current v1.0v2.0分隔到自己的分支中,然后将v3.5重新定位到v1.0v2.0v2.0v3.5到当前版本的第一次提交。

但我不确定你想做什么。


  

有没有办法将src子目录中的3个版本分成不同的分支,而不是保留每个版本的目录?

是的,我很确定你能做到这一点。我承认,我的方法论有点令人费解......但是这里有。 ,小心并阅读手册页 - 以下命令可能不会搞砸一切,但使用风险自负。

  1. v3.5 - 进入一个新的分支。
  2. 删除git checkout -b v1.0以外的所有内容。有几种方法可以做到这一点。这个问题有一些除去一切的方法;我不能让他们为我工作,它可能对你更好。

    v1.0

    这将从分支中删除`git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch src/v2.0" --prune-empty -f` 和所有关联的历史记录。此过滤器不需要src/v2.0;但是-f做了某种备份(阅读手册页?),它可能会吐出错误。它会第二次尝试git-filter-branch时出类拔萃。

    重复此操作以删除git filter-branch

    这将为您留下src/v3.5。您可能希望将来源从src/v1.0转移到src/v1.0;您可以运行src(阅读手册页)来获取目录结构git filter-branch --subdirectory-filter(除了子目录/v1.0-files中的文件之外什么都没有;已将内容从v1.0移到v1.0),然后查看root页面(特别是底部示例)中的示例,将文件转移到子目录中。这可能是过度的,然后你需要将那个合并到一个包含man git-filter-branch剔除的所有其他内容的分支中;一个简单的git filter-branch --subdirectory可能会起作用,但您的历史记录中会有另一个提交。我不知道你更喜欢什么。

    所以现在你已经拥有mv v1.0/* .自己的分支。耶!

  3. 重复v1.0v2.0

  4. 我恐怕看不到这样做,只是给你......“奇怪的”历史。据推测,v3.5基本上有v2.0 +改进;我上面列出的结构(三个“死胡同”分支)显示v1.0v2.0不构建在以前的版本上。我不完全确定你有什么样的历史,如果这是一个问题,等等。

    因为你在他们自己的小分支中有v3.5v1.0v2.0,你可以v3.5他们或git merge等等,如果你我更喜欢看起来更漂亮的历史。

    希望这能让你有所思考;就像我说的那样,请阅读手册页。 :)