我有这个 Git 存储库,其中包含两个文件夹:binary-search
和poker
.
例如:https ://github.com/soulnafein/code-katas
我想将这些文件夹变成子模块并保留它们的更改历史记录。
我怎样才能做到这一点?
我有这个 Git 存储库,其中包含两个文件夹:binary-search
和poker
.
例如:https ://github.com/soulnafein/code-katas
我想将这些文件夹变成子模块并保留它们的更改历史记录。
我怎样才能做到这一点?
今天有一个更好的方法来做到这一点:git subtree
看到这个答案。
一般的想法是使用' git filter-branch'和以下步骤:
1)使用 --subdirectory-filter of 创建一个子模块filter-branch
(在克隆你的 repo 之后)。
$ git filter-branch --subdirectory-filter ABC HEAD -- --all
有关此步骤的更多信息,请参阅此SO 问题。
2)使用索引过滤器创建一个超级项目filter-branch
以删除子模块。
$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD
3) 将子模块提交到最新版本的超级项目。
有关实际示例,请参阅将子目录分离到单独的 git 存储库中。
每个子模块都将保留其历史记录。
但正如这个补丁提案中所说,它将:
失去超级项目和子模块之间的所有历史联系,破坏像'
git bisect
'这样的工具,并且难以恢复旧版本。理想情况下,新创建的超级项目的每个版本都将链接到子模块的正确版本(并且所有 .gitmodules 条目也将在整个项目历史中正确设置)
如果您不需要将以前的历史记录链接到新的子模块,则可以按照上述步骤操作。
但是,如果您确实需要在引用子模块(目前是简单的子目录)的同时从较旧的点分支,您可以考虑尝试我所指的补丁中提到的脚本。正如Junio C Hamano所说:
不幸的是,我认为我们没有完全设计(也没有实现)行为来检查具有相同子模块在超级项目树中移动的不同历史点。