将git项目细分为子模块
问题描述:
我有一个当前正在增长的git项目,并且有几个部分开始成为自己的项目。将git项目细分为子模块
所以,我想为它们创建子模块,但保留文件的历史。有不同的文件夹之间移动(例如,从partThatIsNotItsOwnProject
到partThatIsItsOwnProject
,我想对这一举动的历史了。)
前:我想有
/.git
/someFiles
/partThatIsItsOwnProject
--/subdirectory
/partThatIsNotItsOwnProject
--/subdirectory
:
/.git
/someFiles
/partThatIsItsOwnProject
--/.git
--/subdirectory
/partThatIsNotItsOwnProject
--/subdirectory
所以,我猜想git subtree
会这样做,但它似乎保留原始的git存储库,只显示它的一部分。 git submodule
似乎是此设置的目标,但我如何进行转换?
答
为此,您需要重写整个存储库的历史记录,以排除与要放入单独存储库的目录无关的所有内容。 git filter-branch
命令对此很有用。你可以在[0]找到一个脚本的例子。请注意,您可能需要根据需要进行调整。
通常,git filter-branch
[1]允许您通过将过滤器顺序应用于回购库中的每个提交来重写git历史记录。请注意,虽然使用--tree-filter
是实现所需内容的最简单方法,但它非常缓慢,因为它可以正确检出每次提交,因此直接使用--index-filter
编辑索引效果更好。
[0] https://github.com/openstack/oslo.tools/blob/master/filter_git_history.sh
答
叉你主GIT中,然后重命名分叉到 “partThatIsItsOwnProject”,然后除去一切不在于 “子目录” 的一部分。 然后将分叉的git作为子模块添加到主Git中,所有历史记录都会保留。
对于想要从master git中突破的所有子区域重复此操作。