如何将现有GIT存储库的一部分作为子模块

时间:2009-10-20 10:10:24

标签: git git-submodules

我有这个git存储库,其中包含两个文件夹:binary-searchpoker。例如,http://github.com/soulnafein/code-katas

我想将这些文件夹放入子模块并保留其更改历史记录。

我该怎么做?

2 个答案:

答案 0 :(得分:14)

一般的想法是使用'git filter-branch'和以下步骤:

1)使用filter-branch的--subdirectory-filter创建子模块(在克隆你的repo之后)。

$ git filter-branch --subdirectory-filter ABC HEAD -- --all

有关此步骤的详情,请参阅此SO question

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

$ 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条目)

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

  

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

答案 1 :(得分:14)

今天有更好的方法:git subtree

请参阅this answer