问题描述
在我的项目中,有一个包含常用工具的文件夹,我想将其包含在每个应用程序组件中。我只希望它的一个主版本,并且我希望其余副本正常使用git命令进行更新。有什么办法可以将所有内容保存在同一存储库中?我知道子模块可以在多个存储库中使用,但似乎无法在单个存储库中使用。有人对此事有见识吗?
解决方法
您可能想研究git subtree
。
看看这两篇文章:
它的文档不在git-scm.org上提供(我不能说为什么),您可以通过键入git help subtree
或从git
的源代码中读取它来阅读仓库:
- git-subtree(版本2.29-2020年第四季度)
从技术上讲,您可以在内部将一个仓库作为一个子模块;不寻常的东西将来自:
- 将在子模块目录中检出的提交
- 分支名称
- 子模块的通讯历史。
假设您的代码如下:
Readme.md
libs/util/fileA.py
libs/util/fileB.py
src/main.py
,您希望将libs/util/
的内容作为“自托管”子模块。
- 关于子模块的提交:
这意味着您回购的某个提交的完整内容应为:
fileA.py
fileB.py
在同一仓库中,您将有一个代表“完整项目”的提交和一个代表“只是util lib”的提交,彼此相邻。
这是完全可管理的,一开始只是令人惊讶。
- 关于分支名称:
由于您的仓库可能已经有一个名为master
的分支,它代表“完成”项目的状态,因此您不能将该名称用于“子模块”部分的分支。
最简单的方法是选择一组专用于该子模块的名称(例如:util/*
)并坚持下去。
- 关于历史:
在同一分支中提交完整存储库和仅提交子模块并没有多大意义。专用于子模块的分支与“完整”项目的分支没有关系。
再次:git可以完美地管理它。这是在您的仓库中创建这样的起始分支的一种方法:
# from your repo's 'master' branch :
git checkout -b util/master
git filter-branch --subdirectory-filter libs/util
查看git-subtree
的工作方式时,它可以处理相同的设置:将不相关的分支存储在同一存储库中,并在您选择的位置签出子分支。
它的主要优点是:由于它从一开始就打算以这种方式工作,因此这些命令可能会给您带来更少的摩擦,并且使您在存储库中弄乱事情的方式也更少。