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

问题描述

在我的项目中,有一个包含常用工具的文件夹,我想将其包含在每个应用程序组件中。我只希望它的一个主版本,并且我希望其余副本正常使用git命令进行更新。有什么办法可以将所有内容保存在同一存储库中?我知道子模块可以在多个存储库中使用,但似乎无法在单个存储库中使用。有人对此事有见识吗?

解决方法

您可能想研究git subtree。 看看这两篇文章:

它的文档不在git-scm.org上提供(我不能说为什么),您可以通过键入git help subtree或从git的源代码中读取它来阅读仓库:


从技术上讲,您可以在内部将一个仓库作为一个子模块;不寻常的东西将来自:

  • 将在子模块目录中检出的提交
  • 分支名称
  • 子模块的通讯历史。

假设您的代码如下:

Readme.md
libs/util/fileA.py
libs/util/fileB.py
src/main.py

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

  1. 关于子模块的提交:

这意味着您回购的某个提交的完整内容应为:

fileA.py
fileB.py

在同一仓库中,您将有一个代表“完整项目”的提交和一个代表“只是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

查看git-subtree的工作方式时,它可以处理相同的设置:将不相关的分支存储在同一存储库中,并在您选择的位置签出子分支。

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