Git子模块
1. 问题背景
随着产品的日益增多,各个产品之间的业务功能会出现高度的相同性,比如产品A有串口的接收功能,产品B也有相同的串口功能,这类功能我们可以写成一个通用的串口接收模块。这样就可以避免每个产品都copy一遍代码,造成了大量的代码冗余,且后续修改也要挨个进行一遍,所以本文我们引入git 子模块的概念,就可以很好的解决这个问题。
Git 通过子模块来解决这个问题,子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录,它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
子模块学习参考如下链接:https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97
2.子模块的拉取和同步修改
2.1. clone含有子模块的项目
-
方式一
-
克隆主仓库:url为主仓库的地址
git clone url
-
初始化本地配置文件
git submodule init
-
从该项目中抓取所有数据并检出父项目中列出的合适的提交
git submodule update
-
将 git submodule init 和 git submodule update 合并成一步
git submodule update --init
-
-
方式二
克隆并更新仓库中的每一个子模块,包括可能存在的嵌套子模块
git clone --recurse-submodules url
说明:克隆下来的项目,子模块留在一个称作“游离的 HEAD”的状态。
2.2. 同步子模块的更改
-
方式一
进入子模块的目录下,执行
git pull origin master
-
方式二
直接在主仓库下执行
git submodule update --remote [submodule name]
此命令默认会假定你想要更新并检出子模块仓库的 master 分支
2.3. 同步项目的更改
-
方式一
git pull
git submodule update --init
如果子模块有嵌套的子模块,则应使用 --recursive 选项
-
方式二
git pull --recurse-submodules
3. 子模块的推送
进入每一个子模块的目录下,依次执行
git checkout -b 'xxx'
//由于拉下来的是“游离的 HEAD”的状态,所以得先切换出自己得分钟,或者切到原有分支也可
git add .
git commit -m 'xxx'
git push
一系列常规的推送指令
为了防止有些子仓库修改后没有提交的小技巧(新手不建议使用):
-
可以将git push 命令接受可以设置为 “check” 或 “on-demand” 的–recurse-submodules参数
-
git push --recurse-submodules=check
git push --recurse-submodules=on-demand
git config push.recurseSubmodules check
git config push.recurseSubmodules
-
4. 子模块的添加
在需要添加子模块的文件夹下执行git submodule add url
即可
5.一些常用的子模块指令
-
查看子模块更新信息
git log -p --submodule
-
修改子模块跟踪的分支
git config -f .gitmodules submodule.(submodule name).branch (branch name)
例如:submodule name为sub_1,branch name为dev;
则git config -f .gitmodules submodule.sub_1.branch dev。
-
子模块遍历
git submodule foreach 'git命令'
例如:
git submodule foreach 'git status'
git submodule foreach 'git checkout master'
-
查看子模块指向哪个commit
git submodule status
-
删除子模块
git submodule deinit submodulename
git rm submodulename
git rm --cached submodulename
rm -rf ./git/modules/submodulename
-
修改子模块url
打开.gitmodules,找到对应模块的url并修改保存,然后执行
git submodule sync
-
配置选项
显示子模块的更改摘要
git config status.submodulesummary 1
关闭子模块的更改摘要
git config status.submodulesummary 0