前言

这个子模块(submodule) 也是我在写这章的时候才知道的东西😁,也是把书读厚了,学到新东西了。
我也没实践过但是我猜啊,比如在React Native的开发过程中,除了用RN的那一套前端代码,在需要用到某些RN无法实现的功能时,需要进行原生开发,这时候这一个项目同时又前端的代码(typescript)、Android的代码(kotlin)、ios的代码(swift),利用这个子模块(submodule)就可以在这个大项目中又对三块截然不同的代码进行细分管理。
嘻嘻,讲都讲到这了那我就简单提提我设想的技术路线,我之前学过一年的安卓开发,期间也接触了ios的开发,也是发现了原生开发的磨叽,想着能否实现跨端,于是发现了React Native,便开始从头来过,走前端路线三件套、React、ts、tailwind等等前端技术,最后过渡到RN,在移动端深入下去🤪🤪🤪。

子模块(submodule)

Git中的子模块(submodule)功能主要用来管理一个仓库中的多个独立的项目代码,便于将其作为另一个项目的依赖并一起管理。子模块适合那种多项目组合的场景,比如在一个大项目中嵌入另一个独立开发和管理的项目。

子模块的基本概念

子模块本质上是一个Git仓库,可以作为另一个仓库的子目录进行管理。通过子模块功能,你可以将其他项目引入你的项目中而无需将它们的代码直接复制粘贴进去。当子模块的内容更新时,你可以选择同步这些更新。

子模块的基本操作命令

  1. 添加子模块

    git submodule add <repository-url> <path>

    • 例如,将子模块添加到 libs/ 文件夹中:

      git submodule add https://github.com/example/lib.git libs/lib

    • 该命令会在指定路径下将外部库克隆为子模块,并在 .gitmodules 文件中记录子模块信息。

  2. 初始化子模块

    git submodule init

    • 在克隆包含子模块的仓库后,使用该命令来初始化子模块配置(从 .gitmodules 文件中读取)。
  3. 更新子模块

    git submodule update

    • 使用该命令来检出和更新子模块到正确的版本。

    • 常和 init 一起使用,可以通过以下命令一键初始化和更新所有子模块:

      git submodule update --init --recursive

  4. 克隆包含子模块的仓库: 当克隆一个包含子模块的仓库时,可以使用 --recursive 选项将主仓库和所有子模块一起克隆:

    git clone --recursive <repository-url>

    • 如果没有使用 --recursive,可以在克隆完成后通过 git submodule update --init --recursive 初始化和更新子模块。
  5. 查看子模块的状态

    git submodule status

    • 该命令可以显示子模块的当前版本(提交 SHA-1 值)和路径。
  6. 更改子模块的引用版本: 在子模块目录中进入相应目录并检出所需的分支或标签,然后回到主项目提交更新:

    1
    2
    3
    4
    5
    cd libs/lib
    git checkout <branch-or-tag>
    cd ../..
    git add libs/lib
    git commit -m "Update submodule to <branch-or-tag>"
  7. 删除子模块: 删除子模块比删除普通文件夹稍复杂,步骤如下:

    • .gitmodules 文件中移除子模块条目。

    • .git/config 文件中删除子模块配置。

    • 删除子模块的缓存信息:

      git rm --cached <submodule-path>

    • 最后,删除子模块文件夹。

子模块的优缺点

优点

  • 有利于模块化管理项目,特别是当不同项目之间存在依赖关系时。
  • 每个子模块可以独立发展,不会影响到主项目。
    缺点
  • 操作较为复杂,特别是在多人协作或子模块频繁更新的情况下。
  • 需要额外的维护步骤,比如每次克隆或更新项目都需要初始化和更新子模块。

注意事项

  • 忽略子模块的变动:可以在 .gitmodules 文件中设置子模块的跟踪策略。
  • 同步子模块更新:当主项目中的子模块引用有变更时,确保团队成员在拉取代码后执行 git submodule update
    子模块管理虽然可以方便地集成外部库,但更新、切换分支时需要特别注意保持主项目和子模块的同步。

后记

差不多了,这篇估计是本章的最后一篇🤪了,也是接近尾声了,如果之后还有什么可讲能讲的知识就还会接在本篇后面继续更新的。