使用介绍)
目录一.子模块使用场景二.子模块(submodule)概念的引入三.添加子模块四.查看子模块五.更新子模块■更新项目内子模块到最新版本■更新子模块为远程项目的最新版本六.克隆包含子模块的项目方法一先克隆父项目再更新子模块■克隆父项目■查看子模块■初始化子模块■更新子模块方法二递归克隆整个项目七.删除子模块■删除子模块文件夹■删除.gitmodules文件夹中相关子模块信息■删除.git/config文件夹中的相关子模块信息■删除.git文件夹中的相关子模块文件一.子模块使用场景当你在一个Git 项目上工作时你需要在其中使用另外一个Git 项目它是一个第三方开发的Git 库或者是你独立开发但是在多个父项目中使用的。这个情况下一个常见的问题产生了你想将两个项目单独处理但是又需要在其中一个中使用另外一个。二.子模块(submodule)概念的引入在Git 中你可以用子模块submodule来管理这些项目submodule允许你将一个Git 仓库当作另外一个Git 仓库的子目录。这允许你克隆另外一个仓库到你的项目中并且保持你的提交相对独立。三.添加子模块此文中统一将远程项目https://github.com/cain/cain-test.git克隆到本地test文件夹。git命令git submodule add 子项目url 子项目存放到本地的文件夹名$ git submodule add https://github.com/cain/cain-test.git test以上命令将远程项目https://github.com/cain/cain-test.git克隆到本地test文件夹下。添加子模块后运行git status, 可以看到目录有增加1个自动生成的文件.gitmodules, 这个文件用来保存子模块的信息。$ git status On branch master Initial commit Changes to be committed: (use git rm --cached file... to unstage) new file: .gitmodules new file: test四.查看子模块$ git submodule e23e823d3f51f5ebd731a68da05ad0371c3a0231 test (heads/master)五.更新子模块■更新项目内子模块到最新版本$ git submodule update■更新子模块为远程项目的最新版本$ git submodule update --remote六.克隆包含子模块的项目克隆包含子模块的项目有二种方法一种是先克隆父项目再更新子模块另一种是直接递归克隆整个项目。方法一先克隆父项目再更新子模块■克隆父项目$ git clone https://github.com/cain/cain-assets.git test■查看子模块$ git submodule --e23e823d3f51f5ebd731a68da05ad0371c3a0231 test子模块前面有一个--说明子模块文件还未检入空文件夹。■初始化子模块$ git submodule init Submodule test (https://github.com/cain/cain-test.git) registered for path test■更新子模块$ git submodule update Cloning into test... remote: Counting objects: 151, done. remote: Compressing objects: 100% (80/80), done. remote: Total 151 (delta 18), reused 0 (delta 0), pack-reused 70 Receiving objects: 100% (151/151), 1.34 MiB | 569.00 KiB/s, done. Resolving deltas: 100% (36/36), done. Checking connectivity... done. Submodule path test: checked out e23e823d3f51f5ebd731a68da05ad0371c3a0231在更新的过程中可能要求输入git的用户名和密码。方法二递归克隆整个项目$ git clone https://github.com/cain/cain-test.git test --recursive递归克隆整个项目子模块随父模块同时更新比方法一简洁。七.删除子模块删除子模块比较麻烦需要手动删除相关的文件否则在添加子模块时有可能出现错误。这里要提醒一句网上流传的rm -rf手工清理法删.gitmodules、删.git/config、删.git/modules是野路子容易残留配置导致下次添加报错。■如果子模块里有本地修改、确认要丢弃deinit加-f强制移除# 1. 反初始化从 .git/config 中移除子模块配置 $ git submodule deinit test # 2. 从暂存区和工作区移除子模块目录同时删除 .gitmodules 中的条目 $ git rm test # 3. 提交 $ git commit -m remove submodule test■如果子模块里有本地修改、确认要丢弃deinit加-f强制移除$ git submodule deinit -f test命令速查表命令说明git submodule add url path添加子模块git submodule查看子模块列表git submodule status查看各子模块状态当前提交git submodule init初始化子模块配置git submodule update拉取子模块内容到父项目记录的版本git submodule update --remote更新子模块到远程最新git submodule sync子模块 URL 变更后同步配置git submodule foreach git pull origin master批量更新所有子模块git clone --recurse-submodules url克隆时连子模块一起拉git submodule deinit path卸载子模块官方删除法第一步git rm path移除子模块目录官方删除法第二步两个最常见的坑坑一clone 下来子模块文件夹是空的父仓库只记录子模块的提交 ID不含代码。解法git submodule init git submodule update或克隆时就加--recurse-submodules。坑二别人更新了子模块你拉下来没变化子模块指向的是某个确定提交不是分支最新。解法git submodule update --remote或进子模块目录自己git pull。submodule 这东西用得少一年碰两三次每次都得翻一遍文档。所以把它写下来放这儿下次要用直接抄命令。本文同作者公众号「键盘缝里看人生」——一个还在写代码的中年人那边写技术踩坑也写点生活。