如何使现有Git存储库的一部分成为子模块

如何使现有Git存储库的一部分成为子模块,git,git-submodules,Git,Git Submodules,我有一个Git存储库,它包含两个文件夹:binary search和poker 例如: 我想将这些文件夹转换为子模块,并保留它们的更改历史记录 我如何才能做到这一点?总体思路是使用“和以下步骤: 1) 在克隆repo之后,使用过滤器分支的--subdirectory filter创建子模块 有关此步骤的更多信息,请参见此 2) 使用filter branch的索引过滤器创建超级项目以删除子模块 $ git filter-branch --index-filter "git rm -r -f --

我有一个Git存储库,它包含两个文件夹:
binary search
poker

例如:

我想将这些文件夹转换为子模块,并保留它们的更改历史记录


我如何才能做到这一点?

总体思路是使用“和以下步骤:

1) 在克隆repo之后,使用
过滤器分支的--subdirectory filter创建子模块

有关此步骤的更多信息,请参见此

2) 使用
filter branch
的索引过滤器创建超级项目以删除子模块

$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD
3) 将子模块提交到超级项目的最新版本

有关实际示例,请参见

每个子模块将保留其历史记录。
但正如本文所述,它将:

丢失超级项目和子模块之间的所有历史连接,破坏诸如“
git bisect
”之类的工具,并使恢复旧版本变得困难

理想情况下,新创建的超级项目的每个版本都将链接到子模块的正确版本(并且在项目的整个历史过程中,所有.gitmodules条目也将正确设置)

如果您不需要将以前的历史记录链接到新的子模块,可以按照上述步骤操作。
但是如果你需要从一个旧点分支,同时对你的子模块(目前是简单的子目录)进行引用,你可以考虑尝试在我所提到的补丁中提到的脚本。正如Junio C Hamano所说,它在中讨论过,但还没有集成到Git中:

不幸的是,我认为我们没有完全设计(也没有实现)行为来检查超级项目树中相同子模块移动的不同历史点


现在有一种更好的方法:
git子树

请参阅。

从版本1.7.11开始的可能的副本。
$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD