git submodule子模块使用教程

2019-11-02 · xiejiahe

概述

有这么一个场景:

有3个项目, 商城系统后台系统论坛系统 , 这3个系统都需要依赖一个工具类库,比如说处理日期的。

在传统的开发模式中,这几个系统都会重复实现一遍日期工具类,当日期工具类出现了一个bug,每个系统都得Ctrl+C / Ctrl+V,这样一来就会带来工作效率的问题。

解决上述问题很简单,可以通过 npm 模块解决, 但是 npm 带来的问题就是每次改动都需要发布,而且某些数据有保密性的发布到外网就不合适了,内网搭建的话就有点大材小用了。

这个时候 git submodule 用处就来了。

给主仓库添加子模块

add 跟着需要添加为子模块的仓库地址

git submodule add https://github.com/xjh22222228/tomato-work.git

成功添加后会在项目根目录下新建 .gitmodules 文件

删除子模块

当子模块不再需要的时候可以使用下面命令:

# common 为模块的目录名字
# 1. 逆初始化模块, 执行后子模块目录将被删除
git submodule deinit common

# 2. 清除子模块缓存
git rm --cached common

# 3. 提交代码并推送
git commit -am "Remove a submodule" && git push

更新子模块代码

有2种方法可以更新子模块的代码。

1、进入子模块目录拉取Code

cd common
git pull

2、在主项目拉取,common 为子模块的名称

git submodule update --remote common

第二种方式默认针对 master 分支, 如果需要更新其他分支就要配置, develop 为分支名称:

git config -f .gitmodules submodule.common.branch develop

克隆包含子模块仓库

--recursive 使用递归模式,否则子模块代码是无法克隆的

git clone --recursive https://github.com/xjh22222228/tomato-work.git

修复子项目为detached head

当克隆项目后所有子模块的分支都指向 detached head, 为了修复这个问题,直接在根项目执行:

git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'

最后

子模块作用于公共代码,如果想在项目中包含某个库的代码那么这个时候就需要 git submodule 了。

https://github.com/xjh22222228/git-manual

git/svn
原创文章,转载请注明出处。