2012-02-12 146 views
5

我终于将我们的CVS仓库迁移到git。不幸的是,我们没有在CVS中使用分支,但不同的版本/分支被分成不同的子目录。将git仓库中的文件夹拆分为不同的分支

I.E.我们有以下的目录结构:

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

有没有办法在SRC子目录中的3个版本分为单独的分支,而不是保存目录为每个版本?

我在堆栈溢出Question 4877053上发现了同样的问题,在这里提议使用git-subtree,但即使阅读了git-subtree的手册,我也不知道如何使用它来解决我的问题。

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

我是很新的Git,也许这就是为什么我不明白的子树手动;-)

非常感谢您的所有anwers!

+0

您是否有与不同版本目录相关的提交历史记录?当您将CVS回购迁移到git时,您现在有没有想保留的历史记录?我敢肯定,你可以使用'git filter-branch'和'git merge'组合来拆分这些目录,但是如果不知道你想保留什么或者你想要最终的存储库看什么喜欢。 – simont 2012-03-02 15:52:08

回答

3

这取决于你想要在仓库中剩下的东西。

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

/root 
    /lib 
    /tools 
    /src 

然后是的,我敢肯定,你可以做到这一点。

-- A -- B -- Current 
       | 
       |--- v1.0 
       |--- v2.0 
       |--- v3.5 

ABCurrent幸福,因为你迁移到Git修订已经提交,并在v1.0v2.0v3.5基本上都是“死了:你会在分支结构方面有这样的事情结束了结束“分支。你可以做一些花哨的东西,如果你想获得一个分支结构更像是:

-- v1.0 --- v2.0 --- v3.5 -- A -- B -- Current 

也就是说,独立v1.0v2.0,并v3.5到自己的分支机构,然后重订v1.0v2.0v2.0v3.5,和v3.5到当前版本的第一次提交。

但我不确定你想要做什么。


有没有办法在SRC子目录中的3个版本分为单独的分支,而不是保存目录为每个版本?

是的,我敢肯定你可以做到这一点。我的方法论有点......错综复杂,我承认,但是在这里。 ,小心,阅读手册页 - 以下命令可能不会搞砸一切,但使用风险自负。

  1. git checkout -b v1.0 - 进入一个新的分支。
  2. 删除除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/* .可能会工作,但你会在你的历史中有另一个提交。我不知道你更喜欢什么。

    所以现在你已经有v1.0在它自己的分支。好极了!

  3. 重复执行v2.0v3.5

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

因为你必须有v1.0v2.0v3.5在自己的小树枝,你可以git merge他们或git rebase等等等等,如果你更喜欢更美观的历史。

希望这给你一点点思考;就像我说的,请阅读手册页。 :)