【git】submodule

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

【git】submodule

参考链接
Git Submodules 介绍通俗易懂总结了工作完全够用的 submodule 命令

如何创建 submodule 关系

cd到主项目执行

git submodule add ...(另一仓库地址即git clone时后面那串东西)

下面可以指定 submodule 放到哪个子文件夹

git submodule add ...(另一仓库地址) [(可选submodule下载的路径)]
如何 clone 包含 submodule 的仓库
方法一按需 clone submodule

(1) 先 git clone 主项目仓库并进入主项目文件夹这时候 submodule 的文件夹都是空的。
(2) 执行

git submodule init [submodule的文件夹的相对路径]

(3) 执行

git submodule update [submodule的文件夹的相对路径]

这就按需 clone了submodule。

按需 clone submodule 什么时候有用呢

跨团队协作某个主项目时一些其它团队的 submodule 没必要安装就不必执行 init 和update。

合并 step 2 和 step 3
git submodule update --init [submodule的文件夹的相对路径]
NOTE

–init 和 [submodule的文件夹的相对路径] 的位置不可以调换。

方法二一次性 clone 所有 submodule

(1) 先 git clone 主项目仓库这时候 submodule 的文件夹都是空的。

(2) 执行

git submodule init

(3) 执行

git submodule update

只要不写 [submodule的文件夹的相对路径]那么就一次性检查该主项目的所有submodule都拉下来。

合并 step 2 和 step 3
git submodule update --init
合并step 1、 step 2 和 step 3
git clone --recurse-submodules [主项目Git仓库地址]
submodule介绍

(1) 项目很大参与开发人员多的时候需要将各个模块文件进行抽离单独管理。

(2) 使用 git submodule 来对项目文件做成模块抽离抽离出来的文件可单独成为一个 git 仓库。

整个主项目对抽离出来的子项目子模块有依赖关系却又并不关心子项目子模块的内部开发流程细节。

(3) 代码如果全员可见可以做成分支进行管理如果代码不可见可以创建为子仓库独立一个git 仓库子仓库管理模块代码主仓库定时更新。

(4) 简单理解项目工程为一个仓库模块为一个仓库主仓库操作 git module 命令来使用这个模块子仓库主项目子模块可由不同的开发人员维护。

为什么有 submodules
(1) 解决公共代码问题。

如果某些文件在项目A和项目B中都会用到例如组件库那么这些文件可以作为 submodules 来管理减少重复代码。当然该场景下npm包是另一解决方案你需要选择一种方案。

(2) 解决团队维护难题。

如果一个大项目是一个大 Git 仓库需要统一编译不同的模块由不同团队维护放在同一个 Git 仓库有诸多难处。

例如多个团队的 MR 混在一起、权限难以区分等。这种情况即使公司内网 Git 权限做的足够精细仓库管理员的学习成本也会很高很难深度使用这种高级功能。

为了解决多团队维护的难题Git Submodules 也能大展身手它可以让每个团队负责的模块就是一个 Git 仓库这些 Git 仓库都被包含在同一个主 Git 项目下。当然微前端、微服务是另一种解决方案你需要选择一种方案。

了解 Git Submodules

有2个概念主项目、submodule子模块。这两者各自都是完整的 Git 仓库。

如何让一个 Git 仓库变为另一个 Git 仓库的 submodule

(1) 创建 Git 仓库 A。
(2) 创建 Git 仓库 B。
(3) 在 Git 仓库 A 中通过

git submodule add ...(仓库B的地址即git clone时后面那串东西)

可以把仓库 B 当作仓库 A 的 submodule此时 A 就成了主项目。

Note

B 也可以做 A 的主项目在仓库B执行

git submodule add ...(A地址)

因为在建立父子关系前二者都是完整 Git 仓库没有差异。

Note

(1) 执行操作后会在当前父项目下新建个文件夹名字就是 submodule 仓库的名字。这个文件夹里面的内容是 submodule 对应 Git 仓库的完整代码。

(2) 如果希望换个名字或者换个路径例如放在某个更深的目录下也是允许的需要后面增加个路径参数例如

git submodule add ...(仓库地址) src/B(你希望 submodule 位于的文件夹路径)
submodule 的父子关系存在哪里

关系保存在主项目的 Git 仓库中。

被当作 submodule 的 Git 仓库其实不知道自己变成了 submodule它更不知道爸爸们有谁。意思是当你打开某个被当作 submodule 的 Git 仓库首页时或者拉下这个仓库时没有任何痕迹表明它是个submodule。因为父子信息不存在这里只存在爸爸那里。

submodule 的父子关系信息怎么存
.gitmodules 文件

父子关系的信息保存在主项目的 .gitmodules 文件如果不是新加 submodule这个文件通常不必改变了因为信息比较固定。

submodule 的版本号

主项目还保存了对应 submodule 的版本号commit id没有冗余存储 submodule 的代码

可以看到这其实是个跳转到另一个仓库的链接指明了具体的 commit id。

这个版本号是需要经常变更的。
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6