我可以在同一存储库中使用 git 子模块吗?

Are*_*res 5 git repository

在我的项目中,有一个包含常用工具的文件夹,我希望将其包含在每个应用程序组件中。我只想要它的一个主版本,并且我希望像平常一样使用 git 命令更新其余副本。有没有办法做到这一点,同时将所有内容都保存在同一个存储库中?我知道 get 子模块适用于多个存储库,但 \xe2\x80\x99t 似乎只适用于单个存储库。有人对此事有任何见解吗?

\n

LeG*_*GEC 2

您可能想调查一下git subtree。看看这两篇文章:

它的文档不在 git-scm.org 上提供(我无法说出原因),您可以通过键入 来阅读它,或者从的 repogit help subtree中的源代码中读取它:git


从技术上讲,您可以将存储库作为子模块包含在其内部;不寻常的东西来自:

  • 将在子模块目录中签出的提交,
  • 分支机构名称,
  • 子模块的通讯历史记录。

假设您的代码如下所示:

Readme.md
libs/util/fileA.py
libs/util/fileB.py
src/main.py
Run Code Online (Sandbox Code Playgroud)

并且您希望将内容libs/util/作为“自托管”子模块。

  1. 关于子模块的提交:

这意味着您的存储库的某个提交的完整内容应该是:

fileA.py
fileB.py
Run Code Online (Sandbox Code Playgroud)

在同一个存储库中,您将拥有代表“完整项目”的提交和代表“只是 util lib”的提交,它们并排放置。
这是完全可以管理的,一开始只是令人惊讶。

  1. 关于分支名称:

master由于您的存储库可能已经有一个名为代表“完整”项目状态的分支,因此您不能将该名称用于“子模块”部分的分支。

最简单的方法是选择一组专用于该子模块的名称(例如:)util/*并坚持使用。

  1. 关于历史:

在同一分支中提交完整存储库并仅提交子模块没有多大意义。专用于子模块的分支与“完整”项目的分支没有关系。

再说一次:git 可以完美地管理它。这是在存储库中创建此类起始分支的一种方法:

# from your repo's 'master' branch :
git checkout -b util/master
git filter-branch --subdirectory-filter  libs/util
Run Code Online (Sandbox Code Playgroud)

当您查看git-subtree工作原理时,它允许您处理相同类型的设置:存储在同一存储库中的不相关分支,并在您选择的位置检出子分支。

它的主要优点是:由于它从一开始就打算以这种方式工作,因此这些命令可能会给您带来更少的摩擦,并且更少地在您的存储库中搞砸事情。