将Git子树转换为子模块

时间:2017-05-05 10:30:11

标签: git git-submodules git-subtree

我确信git子树不适合我的项目,我想将我的git子树结构转换为git子模块。我怎样才能做到这一点? 结构:

main-repo
│   index.js
│   package.json   
│
└───vendor
    └───subtree-repo
        │   index.js
        │   package.json

2 个答案:

答案 0 :(得分:1)

也许删除目录然后添加子模块?

git rm vendor/subtree-repo
git submodule add git@github.com:blah/subtree-repo.git vendor/subtree-repo/

答案 1 :(得分:0)

虽然看起来答案显然正是奥马尔·杰克曼所暗示的 - 而且我认为这些步骤没有任何问题 - 但这确实给你留下了可能不太理想的历史。特别是,我假设您希望vendor目录移动到自己的仓库,某个团队将直接使用该新仓库。如果您希望他们拥有完整的历史记录,那么还有另一个步骤。

该步骤是将git filter-branch--subdirectory-filter一起使用。

的内容
git clone path/to/old_repo vendor_repo
cd vendor_repo
git remote remove origin
git filter-branch --subdirectory-filter vendor --prune-empty -- --all

然后验证结果; vendor_repo应包含vendor中发生的更改的完整历史记录。如果它看起来不错,你可以清理它。 (您可能希望删除filter-branch创建的备份引用,reflog以及仍然混乱的现在无法访问的提交vendor-repo;重新克隆可能是一个很好的快捷方式。

所以现在你实际上有一个回购用于奥马尔推荐程序的第二步。

您仍然应该将供应商历史保留在父仓库中,因为正确地将正确的子模块提交引用替换为每个历史的父仓库提交对我来说听起来并不是很有趣。我不是说不能这样做;您需要捕获parent-repo提交到vendor-repo提交的地图,然后使用该地图来驱动--tree-filter或类似的东西。但这样做会有很多好处吗?

无论哪种方式,您都可以轻松地将vendor替换为当前的子模块提交,并使用前面的子模块。