2016-12-15 176 views
0

我有一个当前正在增长的git项目,并且有几个部分开始成为自己的项目。将git项目细分为子模块

所以,我想为它们创建子模块,但保留文件的历史。有不同的文件夹之间移动(例如,从partThatIsNotItsOwnProjectpartThatIsItsOwnProject,我想对这一举动的历史了。)

前:我想有

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

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

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

回答

1

为此,您需要重写整个存储库的历史记录,以排除与要放入单独存储库的目录无关的所有内容。 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

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

1

叉你主GIT中,然后重命名分叉到 “partThatIsItsOwnProject”,然后除去一切不在于 “子目录” 的一部分。 然后将分叉的git作为子模块添加到主Git中,所有历史记录都会保留。

对于想要从master git中突破的所有子区域重复此操作。