引言

在探索 Hugo 建站过程中,我了解到了 git submodule 这一命令。git submodule 允许将一个 Git 仓库作为另一个 Git 仓库的子模块。这在使用第三方模块或库时尤其有用,因为它允许你在不需要自行维护这些模块的情况下,轻松同步和更新它们。

Git Submodule 的使用场景

Git Submodule 主要用于以下场景:

  1. 第三方库的集成与管理: 当项目依赖于第三方库或模块时,使用子模块可以避免直接复制代码到项目中,便于管理和更新。
  2. 项目组件化: 对于大型项目,将不同的功能模块化并存储在不同的仓库中,然后通过子模块的方式集成到主项目中,可以提高项目的可维护性和复用性。

使用 Git Submodule 克隆仓库

创建和添加子模块

  1. 假设有两个仓库:主仓库 body 和子模块仓库 leg

  2. 克隆主仓库到本地,并用 submodule 添加子模块

    1
    2
    3
    git clone git@github.com:YourUsername/body.git
    cd body
    git submodule add git@github.com:YourUsername/leg.git
  3. 添加子模块后,会看到多了两个文件:子模块 leg 和配置文件 .gitmodules。提交这些更改并推送到远端。

  4. 进入仓库查看,leg 只是快捷方式,连接到 leg 库的地址, 版本库中不会存第三方引入库的实体文件, 而是通过 .gitmodules 的方式存储地址, 当下载到本地运行的时候才会再拉取文件。
    pic

克隆带有子模块的仓库

  1. 克隆带有子模块的仓库:
    1
    2
    git clone git@github.com:YourUsername/body.git newbody
    cd newbody/
  2. 此时,子模块文件夹为空
    20210917230632
  3. 初始化并更新子模块:
    1
    2
    git submodule init
    git submodule update
    或者使用 --recursive 参数一步到位:
    1
    git clone --recursive git@github.com:YourUsername/body.git newbody

更新子模块

若子模块有更新,需要在主仓库中同步更新:

1
git submodule update --remote

子模块的修改和提交

如果需要对子模块进行修改并提交,通常需要经历以下过程:

  1. 在子模块目录中进行更改。

  2. 提交更改到子模块的仓库。

  3. 在主仓库中提交子模块的更新。

删除子模块

删除子模块较繁琐,步骤如下:

  1. rm -rf <子模块目录> 删除子模块目录及源码

    1
    2
    cd newbody/
    rm -rf leg/
  2. 删除项目目录下 .gitmodules 文件中子模块相关条目
    delete

  3. vi .git/config 删除配置项中子模块相关条目
    20210918092129

  4. rm .git/module/<子模块名> -rf 删除模块下的子模块目录,每个子模块对应一个目录.

注:之后如果添后子模块命令报错,执行 git rm --cached <模块名> 再提交即可。

参考资料