【问题标题】:How to make part of an existing Git repository a submodule如何使现有 Git 存储库的一部分成为子模块
【发布时间】:2009-10-20 10:10:24
【问题描述】:

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

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

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

我该怎么做?

【问题讨论】:

标签: git git-submodules


【解决方案1】:

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

this answer

【讨论】:

【解决方案2】:

大体思路是使用'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 所说:

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

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 2019-05-10
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2019-02-16
    相关资源
    最近更新 更多