1

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

例子:

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

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

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

  • 子模块是整个仓库,而不是子文件夹。我不想要整个仓库,只想要一个文件夹。

子树合并策略不起作用,因为:

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

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

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

  1. 为 Project1 创建一个分支。
  2. 从此分支中删除我不想要的所有内容。
  3. 将我想要的文件移动到此分支的根目录。
  4. 删除子文件夹。
  5. 将此分支作为子模块添加到 Project1+。

这有点奏效。我修改了 Project1 主分支并能够将更改合并到新分支中,因此更新了子模块,但这似乎不必要地复杂(考虑到它在 SVN 中的简单程度)。此外,当我合并 Project1 中的更改时,它似乎认为删除的文件有冲突;即更新Project1 只是一个巨大的PITA。也许我需要不同的合并策略?

但主要是我问这甚至是正确的道路吗?

作为记录,这对于 SVN Externals 来说非常简单。所以用例就在那里。我意识到完全有可能没有人用 git 来做这件事。经过几天的研究,我可以在网上找到的解释都归结为“重组你的项目,让每个 repo 都有你想要分享的东西”;即 Project1 中的“子文件夹”成为它自己的存储库。我希望这不是最终的答案。

谢谢!

4

1 回答 1

2

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

  • 认为,您甚至可以使用子模块(上面的注释)
  • 恕我直言(非常谦虚),git-subtree是更好的迭代,将在不久的将来完全替换 uly 子模块。使用 git subtree 在项目之间共享代码展示了与您的情况几乎相同的很好的用例,详细的分步说明了将单片存储库转换为由子树 2 存储库链接的命令指南,分离的存储库已准备好重新使用
于 2012-11-07T00:31:35.490 回答