Git 子模块使用

作者 Leehyon | 593 字, 2 分钟 | 0 评论 | 2022-11-21 | 类别 Articles

git, help

更新

2024-08-28

请移步数字花园文章 Manage Git Submodules 了解更多内容。

前言

git clone 他人项目时,有时候会看到仓库目录下有一个 .gitmodules 的文本文件,打开后有如下类似内容:

[submodule "themes/den"]
	path = themes/den
	url = [email protected]:leehyon/hugo-theme-den.git
	branch = koh

上述内容表面该仓库使用了 git submodule 方式链接了其他仓库。如果要使用被链接的仓库,需要用以下命令进行初始化:

$ git submodule update --init --recursive

为什么使用子模块

其实背后的思想是模块化设计:

  • 根据代码功能或维护周期把项目拆分成不同的子模块并建立不同的仓库
  • 一个模块能被多处使用,通过 git submodule 进行关联
  • 主模块不必负责子模块的维护,只在必要时候同步更新

另外,如果项目依赖一个开源的第三方库时,也建议将第三方库设置为子模块。

主要内容

  • 添加子模块到仓库并不会把子模块的源码添加进来,只是添加子模块的信息,比如 urlbranch
  • 添加后的子模块不会随子模块仓库的更新而自动更新,以保证主仓库的稳定性

添加子模块

$ git submodule add <submodule_url> <path>

执行添加命令成功后,可以在当前路径中看到一个 .gitsubmodule 文件,里面的内容就是子模块的信息。

如果在添加子模块的时候想要指定分支,可以利用 -b 参数:

$ git submodule add -b <branch> <url> <path>

添加之后,仓库 <path> 目录下不会有任何变化,需要执行下面命令才会添加源码:

$ git submodule update --init --recursive

更新子模块

如果子模块仓库更新了,如有必要,需要手动进行更新,即进入子模块目录,执行 git pull 命令。

删除子模块

网上搜到的方法有点繁琐,其实可以使用 git submodule deinit 命令进行删除:

$ git submodule deinit <submodule_name>
$ git rm <submodule_name>

这个命令如果添加上参数 --force,则子模块工作区内即使有本地的修改,也会被移除。

相关文章