将git项目分段为子模块

时间:2016-12-15 08:47:46

标签: git git-submodules git-subtree

我有一个正在发展的git项目,有几个部分开始成为自己的项目。

因此,我想为它们创建子模块,但保留文件的历史记录。不同文件夹之间有移动(从partThatIsNotItsOwnProjectpartThatIsItsOwnProject的eG,我也希望获得该移动的历史记录。)

在:

/.git
/someFiles
/partThatIsItsOwnProject
--/subdirectory
/partThatIsNotItsOwnProject
--/subdirectory

我想:

/.git
/someFiles
/partThatIsItsOwnProject
--/.git
--/subdirectory
/partThatIsNotItsOwnProject
--/subdirectory

所以,我猜测git subtree会这样做,但它似乎保留了原始的git存储库,只显示了它的一部分。 git submodule似乎是此设置的目标,但我该如何进行转换?

2 个答案:

答案 0 :(得分:1)

为此,您需要重写整个存储库的历史记录,以排除与要放在单独存储库中的目录无关的所有内容。 git filter-branch命令对此很有用。您可以在[0]找到执行此操作的脚本示例。请注意,您可能需要根据需要进行调整。

通常,git filter-branch [1]允许您通过将过滤器按顺序应用于repo中的每个提交来重写git历史记录。请注意,尽管使用--tree-filter是实现所需内容的最简单方法,但是它非常慢,因为它会在整个过程中正确检查每个提交,因此直接使用--index-filter编辑索引会更好。

[0] https://github.com/openstack/oslo.tools/blob/master/filter_git_history.sh

[1] https://git-scm.com/docs/git-filter-branch

答案 1 :(得分:1)

分叉你的主git,然后将forked重命名为“partThatIsItsOwnProject”,然后删除那些不属于那个“subdir”的东西。 然后将forked git作为子模块添加到主git中,保留所有历史记录。

对于要从主git中突破的所有子目录重复。