🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 概述 - submodule 是一个很好的多项目使用共同类库的工具 - 它允许类库项目做为repository,子项目做为一个单独的git项目存在父项目中,子项目可以有自己的独立的commit,push,pull - 父项目以Submodule的形式包含子项目 - 子模块可以有多个 - 某个子模块表现为一个目录, 如 [actionview](https://github.com/lxerxa/actionview) ## 语法 ``` git submodule [--quiet] add [<options>] [--] <repository> [<path>] git submodule [--quiet] status [--cached] [--recursive] [--] [<path>…​] git submodule [--quiet] init [--] [<path>…​] git submodule [--quiet] deinit [-f|--force] (--all|[--] <path>…​) git submodule [--quiet] update [<options>] [--] [<path>…​] git submodule [--quiet] summary [<options>] [--] [<path>…​] git submodule [--quiet] foreach [--recursive] <command> git submodule [--quiet] sync [--recursive] [--] [<path>…​] git submodule [--quiet] absorbgitdirs [--] [<path>…​] ``` ## 场景 ### 创建子模块 ``` git submodule add git@github.com:zjZSTU/hexo-theme-next.git blogs/themes/next ``` 除了添加子仓库之外,还生成了一个配置文件`.gitmodules` ``` > cat .gitmodules [submodule "blogs/themes/next"] path = blogs/themes/next url = git@github.com:zjZSTU/hexo-theme-next.git ``` ### 管理子模块 主仓库只能提示子模块中的文件修改,必须子模块自己进行添加和上传 ### 子模块的更新 ``` // 进入子模块 git pull // 完成后返回到项目目录,可以看到子模块有待提交的更新 git add ``` ### clone 带子模块的项目 1. 直接拉取带子模块的 仓库,加 `--recursive` ``` git clone https://github.com/yyy/xxx.git --recursive ``` 2. 在已clone 的模块中拉取子模块 方式一: ``` # 初始化本地配置文件 $ git submodule init # 拉取远程仓库 $ git submodule update ``` 方式二: ``` git submodule update --init ``` 方式三:如果有嵌套的子模块 ``` git submodule update --init --recursive ``` ### 修改某子模块URL 1. 修改`.gitmodules`文件中对应模块的”url“属性; 2. 使用`git submodule sync`命令,将新的URL更新到文件`.git/config`; ### 删除Submodule git 并不支持直接删除Submodule需要手动删除对应的文件: ``` // 逆初始化模块,执行后可发现模块目录被清空 > git submodule deinit DbConnector // 删除.gitmodules中记录的模块信息 > git rm --cached DbConnector // 提交更改到代码库,可观察到'.gitmodules'内容发生变更 > git commit -am "Remove a submodule." ``` ### 主模块提交时,忽略子模块 ``` > cat .gitmodule [submodule "blogs/themes/next"] path = blogs/themes/next url = https://github.com/zjZSTU/hexo-theme-next.git ignore = all ``` 设置 ignore 设置为 all