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

sou*_*ein 28 git git-submodules

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

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

我怎样才能做到这一点?

Von*_*onC 14

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

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

$ git filter-branch --subdirectory-filter ABC HEAD -- --all
Run Code Online (Sandbox Code Playgroud)

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

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

$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD
Run Code Online (Sandbox Code Playgroud)

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

有关实际示例,请参阅将子目录分离到单独的git存储库中.

每个子模块都将保留其历史记录.
但正如这个补丁提案中所述,它会:

失去了超级项目和子模块之间的所有历史联系,破坏了像' git bisect' 这样的工具,并且难以恢复旧版本.

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

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

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


Roy*_*ron 14

今天有更好的方法: git subtree

看到这个答案.


归档时间:

查看次数:

13885 次

最近记录:

9 年,7 月 前