如何将子文件夹从一个git repo包含到另一个?

时间:2012-11-06 23:44:52

标签: git git-submodules svn-externals

假设我在git仓库中安装了Project1。在Project1中有一个子文件夹,我想包含在Project1 +(Project2,Project3等)中。“include”我不是指复制粘贴。我想要一个Project1的引用,这样如果我对Project1进行更改,我可以自动将这些更改集成到Projects1 +中。此外,我想将它放在Project1 +中的多个位置。

示例:

Project1
|-Subfolder1
  |-Stuff I want...
|-README.md

Project2
|-Subfolder1 <- from Project1
|-SomeOtherFolder
  |-Subfolder1 <- from Project1
|-README.md

Git子模块不起作用,因为:

  • submoldule是整个repo,而不是子文件夹。我不想要整个仓库,只需要一个文件夹。

The subtree merge strategy无效,因为:

  • 仅支持一个子树;当你对子树进行拉取时(git pull -s subtree ...)它只会更新最高级别的那个(无论它们的创建顺序如何)。

现在请记住我是git的新手所以上述结论可能是错误的。但这是我通过研究和实验发现的。

我提出的可能解决方案是:

  1. 为Project1创建分支。
  2. 从此分支中删除我不想要的所有内容。
  3. 将我想要的文件移动到此分支的根目录。
  4. 删除子文件夹。
  5. 将此分支作为子模块添加到Project1 +。
  6. 这种有点工作。我修改了Project1主分支,并且能够将更改合并到新分支中,因此更新子模块,但这似乎不必要地复杂(考虑到它在SVN中的容易程度)。此外,当我合并Project1中的更改​​时,似乎认为已删除的文件存在冲突;即更新Project1只是一个巨大的PITA。也许我需要一个不同的合并策略?

    但主要是我问的是这条路是否正确?

    为了记录,SVN Externals非常容易。所以用例就在那里。我意识到完全有可能没有人用git这样做。经过几天的研究,我可以在网上找到的解释都归结为“重组你的项目,以便每个回购都有你想要分享的东西”;即Project1的“子文件夹”成为它自己的回购。我希望这不是最后的答案。

    谢谢!

1 个答案:

答案 0 :(得分:2)

无论如何,对于所有可能的工作流程,您必须使用3个存储库:Subfolder1变为单独的repo,您​​将在“superrepos”中使用

  • ,你甚至可以使用子模块(上面的注释)
  • 恕我直言(非常谦虚),git-subtree是更好的迭代,并将在最近的将来完全替换uly子模块。 Sharing code between projects with git subtree演示了与您的情况几乎相同的情况的好用例 - 详细的逐步说明,将monolitic repo转换为通过子树2 repos链接的命令指南,分离的repo已准备好重新使用