开发中,一个项目中包含其他项目的代码是一个常见的场景。
比如:
- 你有一个公共的工具类模块被多个项目引用,但又独立维护。
- 大型项目中往往是父子项目多个,几百人维护一个git库的话,麻烦巨大,不如拆分成多个git库。
解决以上问题,有三种办法
笨办法,来回拷贝代码,我想你会疯的。。。- 把代码打车jar包或者npm包,借助第三方远程仓库来实现,但是每次修改代码都有打包发布,也很麻烦。
- git子模块
Git子模块
先看下git submodule的帮助文档
git submodule 示例: ``` 准备两个git库 • https://gitee.com/dakuohao/git-demo.git • https://gitee.com/dakuohao/git-demo-submodule1git submodule -h
usage: git submodule [--quiet] [--cached]
or: git submodule [--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]
or: git submodule [--quiet] status [--cached] [--recursive] [--] [<path>...]
or: git submodule [--quiet] init [--] [<path>...]
or: git submodule [--quiet] deinit [-f|--force] (--all| [--] <path>...)
or: git submodule [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--[no-]single-branch] [--] [<path>...]
or: git submodule [--quiet] set-branch (--default|--branch <branch>) [--] <path>
or: git submodule [--quiet] set-url [--] <path> <newurl>
or: git submodule [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
or: git submodule [--quiet] foreach [--recursive] <command>
or: git submodule [--quiet] sync [--recursive] [--] [<path>...]
or: git submodule [--quiet] absorbgitdirs [--] [<path>...]
克隆git-demo库 git clone https://gitee.com/dakuohao/git-demo.git
添加子模块 cd git-demo git submodule add https://gitee.com/dakuohao/git-demo-submodule1 会生成一个.gitmodules文件,记录子模块信息,同时生成一个子模块文件夹git-demo-submodule1
git status
Changes to be committed:
(use “git restore —staged
提交主项目并推送到远程仓库 git add . git commit -m ‘submodule’ git pull git push
操作子模块开发 切换到子模块目录,其他操作与平时的git命令一样 cd git-demo-submodule1 假设创建一个新文件 echo “test” >test.txt git add . git commit -m “test” git pull git push 切换回主模块 git stauts 会发现多了一个commit git add . git commit -m “add” git pull git push
操作主模块开发 切换到主模块目录,其他操作与平时的git命令一样 echo “test” >test.txt git add . git commit -m “test” git pull git push
基本上就很简单
**submodule常用操作**
给现有仓库增加子模块
git sumodule add
查看子模块
git submodule
更新所有子模块
git submodule update —remote
更新单个子模块,进入子模块目录 git pull 或 git fetch
克隆包含子模块的项目
- 全部克隆,递归克隆
git clone
—recursive - 逐个克隆
克隆父项目 git clone
查看子项目 git submodule 初始化子项目 git submodule init 更新子项目 git submodule update
删除子模块 git rm -f git-demo-submodule1 git rm -cached git-demo-submodule1 -f是强制删除,会删除工作区和缓存区的文件,-cached是只删除缓存区的保留工作区的文件
``
**Git submodule 的本质**<br />本质就是
.git\modules`文件,modules文件下又是若干个子模块文件,相当于若干过.git文件。