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

How to make part of an existing GIT repository a submodule

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

我想把这些文件夹放到子模块中,并保留它们的更改历史记录。

我该怎么做?


今天有一个更好的方法:git subtree

看看这个答案。


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

1)使用--EDOCX1的子目录过滤器(0)创建一个子模块(克隆您的repo之后)。

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

有关此步骤的更多信息,请参阅此问题。

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

1
$ git filter-branch --index-filter"git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD

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

请参见将子目录分离到单独的Git存储库中以获取一个实际示例。

每个子模块都将保留其历史。但正如本补丁方案中所述,它将:

lose all the historical connections between the superproject and the submodule, breaking tools like 'git bisect', and making it difficult to recover old releases.

Ideally, each version of the newly created superproject would be linked to the correct version of the submodule (and all the .gitmodules entries would be set up correctly, too, throughout the project's history)

如果不需要将以前的历史记录链接到新的子模块,可以按照上面提到的步骤操作。但是,如果在引用子模块(当前是简单的子目录)时确实需要从旧的点进行分支,那么您可以考虑尝试使用我引用的补丁中提到的脚本。正如Junio C Hamano所说,在本文中已经讨论过了,但还集成到了Git中:

Unfortunately, I do not think we have designed fully (nor implemented at all) behaviour to check out different points of history that has the same submodule moved around in the superproject tree.