【问题标题】:Convert Git subtree to submodule将 Git 子树转换为子模块
【发布时间】:2017-05-05 10:30:11
【问题描述】:

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

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

【问题讨论】:

    标签: git git-submodules git-subtree


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      虽然看起来答案显然正是 Omar Jackman 所建议的——而且我认为这些步骤没有任何问题——但它确实给你留下了一段可能不太理想的历史。特别是,我假设如果您希望将 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 创建的备份 refs、reflog 以及仍然混乱的 vendor-repo 现在无法访问的提交;在这里重新克隆可能是一个不错的捷径。

      所以现在你实际上有一个 repo 可以在 Omar 推荐程序的第二步中使用。

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

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

      【讨论】:

      • >但是这样做有什么好处吗? Re:tree-filtering the result...所有关于分割子树的讨论都掩盖了这一点,但这正是我想要做的以缩小原始复制品。 (子模块很大,但只有几十个提交)。我的目标是缩小主线存储库(数百次提交),同时保持新存储库和子模块内容之间的历史连接。)我专门寻找这个树过滤器问题的解决方案。
      • 嗯,这要复杂得多。有多种方法可以解决它,但它们都足够复杂,以至于我在没有时间先进行测试的情况下会犹豫建议一种方法。一般来说,您需要一种方法来确定(对于任何原始仓库提交)应该包含哪个供应商仓库提交;你需要你的树过滤器到rm 现有目录,添加子模块,并将子模块签出到已识别的提交
      • 谢谢。最后我放弃了重写所有的历史。相反,鉴于要处理的提交相对较少,我在子模块存储库中手动删除了匹配的分支名称。如果我必须在数百次提交中执行此操作,我会重新访问。
      猜你喜欢
      • 2015-03-28
      • 2015-07-31
      • 2020-03-14
      • 1970-01-01
      • 2012-12-22
      • 2019-06-07
      • 2015-10-24
      • 1970-01-01
      • 2012-09-12
      相关资源
      最近更新 更多