如何使现有Git存储库的一部分成为子模块
我有一个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 --
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