6

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

IE我们有如下目录结构:

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

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

我在 Stack Overflow Question 4877053上发现了同样的问题,其中建议使用 git-subtree,但即使在阅读了 git-subtree 的手册之后,我也不明白如何使用它来解决我的问题。

有人可以给我更详细的解释甚至其他解决方案吗?

我对 git 很陌生,也许这就是我不理解子树手册的原因;-)

非常感谢您的所有回答!

4

1 回答 1

3

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

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

/root
    /lib
    /tools
    /src

那么是的,我很确定你可以做到这一点。就分支结构而言,您最终会得到类似的结果:

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

A, B,Current是您在迁移到 git 后提交的提交,以及 wherev1.0v2.0本质v3.5上是“死胡同”分支。如果您想获得更像这样的分支结构,您可以做一些花哨的事情:

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

也就是说,将v1.0, v2.0, 和分离v3.5到它们自己的分支中,然后重新定位v1.0v2.0, v2.0onv3.5v3.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.0src; 您可以运行git filter-branch --subdirectory-filter(阅读手册页)来获取目录结构/v1.0-files(仅包含子目录中的文件v1.0;已将内容从 移动v1.0root),然后查看页面中的示例man git-filter-branch(特别是底部示例)以移动文件到一个子目录。这可能是矫枉过正,然后你需要将它合并git filter-branch --subdirectory一个包含所有其他剔除的东西的分支中;一个简单的mv v1.0/* .可能会起作用,但是您的历史记录中将有另一个提交。我不知道你喜欢什么。

    所以现在你已经进入v1.0了它自己的分支。耶!

  3. 重复v2.0v3.5

恐怕除了给你……“奇怪”的历史之外,我什么也做不了。大概v2.0有,本质上,v1.0+改进;我上面列出的结构(三个“死胡同”分支)显示v2.0并且v3.5不建立在以前的版本上。我不完全确定你有什么样的历史,如果这是一个问题,等等。

因为你有v1.0v2.0并且v3.5在他们自己的小分支中,你可以git merge他们或git rebase等等,如果你想要一个更好看的历史。

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

于 2012-03-02T16:25:33.623 回答