我终于将我们的CVS存储库迁移到了git。不幸的是,我们在CVS中没有使用分支,但是不同的版本/分支被分到不同的子目录中。
也就是说,我们有以下目录结构:
/root
/lib
/tools
/src
/v1.0
/v2.0
/v3.5有没有办法将src子目录中的3个版本分别放在不同的分支中,而不是保留每个版本的目录?
我在Stack Overflow Question 4877053上发现了同样的问题,这里建议使用git-subtree,但即使在阅读了git-subtree的手册后,我也不知道如何使用它来解决我的问题。
有没有人能给我一个更详细的解释,甚至是另一个解决方案?
我对git非常陌生,也许这就是我不理解子树手册的原因;-)
非常感谢你所有的问候!
发布于 2012-03-03 00:25:34
这取决于您希望在存储库中保留什么内容。
如果你想要三个分支,v1.0,v2.0,v3.5,都有这样的结构:
/root
/lib
/tools
/src是的,我很确定你能做到。在分支结构方面,您最终会得到类似如下的结果:
-- A -- B -- Current
|
|--- v1.0
|--- v2.0
|--- v3.5A,B,Current是你迁移到git后提交的,而v1.0,v2.0和v3.5本质上是“死胡同”的分支。如果你想得到一个更像这样的分支结构,你可以做一些奇特的事情:
-- v1.0 --- v2.0 --- v3.5 -- A -- B -- Current也就是说,将v1.0、v2.0和v3.5分离到各自的分支中,然后将v1.0重新设置为v2.0,将v2.0重新设置为v3.5,将v3.5重新设置为当前版本中的第一个提交。
但我不确定你到底想做什么。
有没有办法将src子目录中的3个版本分别放在不同的分支中,而不是保留每个版本的目录?
是的,我很确定你能做到。我的方法有点...令人费解,我承认,但这是开始了。请,请小心,阅读手册页-以下命令可能不会把一切都搞砸,但使用风险自负。
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/* .可能会起作用,但是您的历史记录中会有另一个提交。我不知道你更喜欢什么。
所以现在你在它自己的分支中有了v1.0。耶!
v2.0和v3.5重复一遍。恐怕我看不出这能做什么除了给你..。然而,“奇怪”的历史。从本质上讲,v2.0可能有v1.0 +的改进;我上面列出的结构(三个“死胡同”分支)表明v2.0和v3.5不是基于以前的版本构建的。我不能完全确定你有什么样的历史,如果这是一个问题,等等。
因为你在它们自己的小分支中有v1.0,v2.0和v3.5,如果你想要一个更好看的历史,你可以对它们进行git merge或者git rebase等。
希望这能给你一点思考;就像我说的,请阅读手册页。:)
https://stackoverflow.com/questions/9248356
复制相似问题