首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使现有Git存储库的一部分成为子模块

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

Stack Overflow用户
提问于 2009-10-20 10:10:24
回答 2查看 15.2K关注 0票数 31

我有这个Git存储库,其中包含两个文件夹:binary-searchpoker

例如:https://github.com/soulnafein/code-katas

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

我该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-20 18:46:27

总体思路是使用'git filter-branch'和以下步骤:

1)使用filter-branch的--subdirectory-filter创建子模块(在克隆您的存储库之后)。

代码语言:javascript
复制
$ git filter-branch --subdirectory-filter ABC HEAD -- --all

有关此步骤的更多信息,请参阅此SO question

2)使用filter-branch的索引过滤器创建一个超项目,删除子模块。

代码语言:javascript
复制
$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD

3)将子模块提交到超级项目的最新版本。

有关实际示例,请参阅Detach subdirectory into separate git repository

每个子模块都将保留其历史记录。

但正如在此patch proposal中所说,它将:

失去了超级项目和子模块之间的所有历史联系,破坏了像“git bisect”这样的工具,并使恢复旧版本变得困难。

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

如果您不需要将以前的历史链接到新子模块,则可以按照上面提到的步骤进行操作。

但是,如果您确实需要从一个较老的点分支,同时引用您的子模块(目前是简单的子目录),您可以考虑尝试我引用的补丁中提到的脚本。正如Junio C Hamano所说,它在this thread中讨论过,但还没有集成到Git中:

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

票数 13
EN

Stack Overflow用户

发布于 2012-05-14 19:36:58

如今,有一种更好的方法可以做到这一点:git subtree

参见this answer

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1593620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档