我最终将我们的CVS存储库迁移到git。不幸的是,我们没有在CVS中使用分支,但是不同的版本/分支被分成不同的子目录。
即。我们有以下目录结构:
/root
/lib
/tools
/src
/v1.0
/v2.0
/v3.5
有没有办法将src子目录中的3个版本分成不同的分支,而不是保留每个版本的目录?
我在Stack Overflow Question 4877053上找到了同样的问题,其中提出了git-subtree的使用,但即使在阅读git-subtree手册后,我也不明白如何使用它解决我的问题。
有人可以给我一个更详细的解释,甚至是另一种解决方案吗?
我对git很新,也许这就是为什么我不理解子树手册; - )
非常感谢你的所有食物!
答案 0 :(得分:3)
这取决于您之后想要保留在存储库中的内容。
如果你想要三个分支,v1.0
,v2.0
,v3.5
,所有分支都是这样的结构:
/root
/lib
/tools
/src
然后是的,我很确定你能做到这一点。在分支结构方面,你最终会得到类似的东西:
-- A -- B -- Current
|
|--- v1.0
|--- v2.0
|--- v3.5
自从您迁移到git以及A
,B
和{{1}之后, Current
,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
到当前版本的第一次提交。
但我不确定你想做什么。
有没有办法将src子目录中的3个版本分成不同的分支,而不是保留每个版本的目录?
是的,我很确定你能做到这一点。我承认,我的方法论有点令人费解......但是这里有。 请,小心并阅读手册页 - 以下命令可能不会搞砸一切,但使用风险自负。
v3.5
- 进入一个新的分支。 删除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
等等,如果你我更喜欢看起来更漂亮的历史。
希望这能让你有所思考;就像我说的那样,请阅读手册页。 :)