Git submodule 子模块的管理和使用

6/29/2021

最近前端项目中有一些公用的组件在多个项目中使用,这些组件目前是在单独的仓库中进行开发和维护,但还并没有发布到是有的npm库中,所以暂时使用git的submodule来引入管理。
在Git 中你可以用子模块submodule来管理这些项目,submodule允许你将一个Git 仓库当作另外一个Git 仓库的子目录。这允许你克隆另外一个仓库到你的项目中并且保持你的提交相对独立。

# 子模块

# 添加

比如将远程项目:https://github.com/wanyakun/yk-component-admin.git 克隆到本地的yk-component-admin文件夹中

git submodule add https://github.com/wanyakun/yk-component-admin.git yk-component-admin
1

查看状态

git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   .gitmodules
	new file:   yk-component-admin
1
2
3
4
5
6
7
8

可以看到目录下有增加一个文件.gitmodules,用来保存子模块信息,内容为:

cat .gitmodules 
[submodule "yk-component-admin"]
	path = yk-component-admin
	url = https://github.com/wanyakun/yk-component-admin.git
1
2
3
4

# 查看

 git submodule
 e39d10b1627318681df87888a6ca57c160ad2a3d yk-component-admin (heads/master)
1
2

# 更新

  • 更新项目内子模块到最新版本
git submodule update
1
  • 更新子模块为远程项目的最新版本
git submodule upate --remote
1

# 修改

在子模块中修改内容后,可以直接提交到远程目录分支。

git add .
git commit -m "commit message"
git push origin master
1
2
3

# 删除

删除子模块比较麻烦,步骤如下:

  1. rm -rf 子模块目录 删除子模块目录及内容
  2. vim .gitmodules 删除项目目录下.gitmodules文件中子模块相关条目
  3. vim .git/config 删除配置项中子模块相关条目
  4. rm .git/module/* 删除模块下的子模块目录,每个子模块对应一个目录,注意只删除对应的子模块目录即可
  5. git rm --cached 子模块名称

# 克隆

克隆包含子模块的项目有二种方法:一种是直接递归克隆整个项目, 一种是先克隆父项目,再更新子模块。

# 递归克隆

克隆主项目时直接克隆子模块,一步到位

git clone https://github.com/wanyakun/yk-mplatform-web.git --recursive 
1

# 先克隆父项目,再更新子模块

  1. 克隆主项目
git clone https://github.com/wanyakun/yk-mplatform-web.git
1
  1. 查看子模块
git submodule
-e39d10b1627318681df87888a6ca57c160ad2a3d yk-component-admin
1
2

子模块前面有一个-,说明子模块文件还未检入(空文件夹)。

  1. 初始化子模块
git submodule init
1
  1. 更新子模块
git submodule update
1
Last Updated: 10/25/2024, 6:55:06 AM