开发中,一个项目中包含其他项目的代码是一个常见的场景。
比如:

  • 你有一个公共的工具类模块被多个项目引用,但又独立维护。
  • 大型项目中往往是父子项目多个,几百人维护一个git库的话,麻烦巨大,不如拆分成多个git库。

解决以上问题,有三种办法

  1. 笨办法,来回拷贝代码,我想你会疯的。。。
  2. 把代码打车jar包或者npm包,借助第三方远程仓库来实现,但是每次修改代码都有打包发布,也很麻烦。
  3. git子模块

    Git子模块

    先看下git submodule的帮助文档
    1. git submodule -h
    2. usage: git submodule [--quiet] [--cached]
    3. or: git submodule [--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]
    4. or: git submodule [--quiet] status [--cached] [--recursive] [--] [<path>...]
    5. or: git submodule [--quiet] init [--] [<path>...]
    6. or: git submodule [--quiet] deinit [-f|--force] (--all| [--] <path>...)
    7. 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>...]
    8. or: git submodule [--quiet] set-branch (--default|--branch <branch>) [--] <path>
    9. or: git submodule [--quiet] set-url [--] <path> <newurl>
    10. or: git submodule [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
    11. or: git submodule [--quiet] foreach [--recursive] <command>
    12. or: git submodule [--quiet] sync [--recursive] [--] [<path>...]
    13. or: git submodule [--quiet] absorbgitdirs [--] [<path>...]
    git submodule 示例: ``` 准备两个git库 • https://gitee.com/dakuohao/git-demo.githttps://gitee.com/dakuohao/git-demo-submodule1

克隆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 …” to unstage) new file: .gitmodules new file: git-demo-submodule1

提交主项目并推送到远程仓库 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

基本上就很简单

  1. **submodule常用操作**

给现有仓库增加子模块

git sumodule add

查看子模块

git submodule

更新所有子模块

git submodule update —remote

更新单个子模块,进入子模块目录 git pull 或 git fetch

克隆包含子模块的项目

  1. 全部克隆,递归克隆 git clone —recursive
  2. 逐个克隆 克隆父项目 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文件。