git submodule 使用场景汇总
文章目录
- 1. 前言
- 2. 基础命令介绍
- 2.1 场景一:已有仓库,添加一个子模块
- 2.2 场景二:已有仓库,添加一个子模块的特定分支
- 2.3 场景三:已有仓库,更新子模块内容
- 2.4 场景四:已有仓库,变更子模块分支
- 2.5 场景五:手动修改.gitmodules不生效问题
- 3. 总结
1. 前言
当我们想要在A项目中使用B项目作为依赖,并且希望和B项目保持同步更新。这个时候git 会将A项目作为B项目的子模块,为了保证B的更新能够在A需要的时候同步到A中,git 推出了子命令submodule,能够非常方便得让A管理 包括B、C在内的多个子模块,并且能够指定具体子模块的一个分支来给A用。
当然,除了介绍submodule 子命令的基本使用之外,也记录一下使用过程中遇到的一些比较坑的问题。
2. 基础命令介绍
2.1 场景一:已有仓库,添加一个子模块
> ls -al
total 8
drwxr-xr-x 4 zhanghuigui staff 128 Feb 5 15:21 .
drwx------@ 35 zhanghuigui staff 1120 Feb 5 15:20 ..
drwxr-xr-x 12 zhanghuigui staff 384 Feb 5 15:26 .git
-rw-r--r-- 1 zhanghuigui staff 7 Feb 5 15:21 README.md
如上已有的一个仓库,现在需要为这个仓库添加一个submodule, https://github.com/hoytech/vmtouch.git
执行如下命令,其中url 之后的vmtouch
是 指定的子模块存放的目录,如果不指定,默认是以子模块的仓库名称命名。
> git submodule add https://github.com/hoytech/vmtouch.git vmtouch
正克隆到 '/Users/zhanghuigui/Desktop/submodule_test/vmtouch'...
remote: Enumerating objects: 546, done.
remote: Total 546 (delta 0), reused 0 (delta 0), pack-reused 546
接收对象中: 100% (546/546), 362.03 KiB | 168.00 KiB/s, 完成.
处理 delta 中: 100% (301/301), 完成.
这个时候如果 执行git status
就能看到 当前仓库下已经有了vmtouch目录 和一个.gitmodules
文件
> git status
位于分支 master
要提交的变更:(使用 "git restore --staged <文件>..." 以取消暂存)新文件: .gitmodules新文件: vmtouch
需要注意的是.gitmodules
是submodule的配置文件,当仓库A 内部有子模块时,就会为A自动生成一个.gitmodules来保存submodule相关的配置,并且这个文件也会被git追踪。
可以看到文件内容如下,submodule 之后的"vmtouch" 表示该submodule所在目录,path后的内容需和submodule保持一致。
> cat .gitmodules
[submodule "vmtouch"]path = vmtouchurl = https://github.com/hoytech/vmtouch.git
想要对比cache的不同内容,可以通过git diff --cached
,可以看到尽管vmtouch是一个目录,但是git 并不会追踪其内部的数据文件。
> git diff --cached vmtouch
diff --git a/vmtouch b/vmtouch
new file mode 160000
index 0000000..3382336
--- /dev/null
+++ b/vmtouch
@@ -0,0 +1 @@
+Subproject commit 3382336a9be3ab9b3552208a3db4ada7e247b542
最后提交变更即可:
> git commit -m "[feature] add the vmtouch as submodule"
[master f198528] [feature] add the vmtouch as submodule2 files changed, 4 insertions(+)create mode 100644 .gitmodulescreate mode 160000 vmtouch> git push origin master # 提交到远端仓库
submodule的子模块也会被添加到当前仓库的config文件中:
> cat .git/config [core]repositoryformatversion = 0filemode = truebare = falselogallrefupdates = trueignorecase = trueprecomposeunicode = true [submodule "vmtouch"]active = trueurl = https://github.com/hoytech/vmtouch.git
2.2 场景二:已有仓库,添加一个子模块的特定分支
我们想要为一个已经存在的仓库添加一个子模块,并且仅仅将这个子模块的指定分支添加进来,初使目录还是之前的目录
> la
total 16
drwxr-xr-x 13 zhanghuigui staff 416B Feb 5 16:06 .git
-rw-r--r-- 1 zhanghuigui staff 84B Feb 5 15:37 .gitmodules
-rw-r--r-- 1 zhanghuigui staff 7B Feb 5 15:21 README.md
drwxr-xr-x 2 zhanghuigui staff 64B Feb 5 15:58 vmtouch
添加一个子模块到指定目录,并指定其分支:
> git submodule add -b support-block-devices -- https://github.com/hoytech/vmtouch.git thirdparty/vmtouch
指定了vmtouch
的support-block-devices
分支,并 将vmtouch子模块放在了thirdparty/vmtouch 目录下。
这个时候文件又发生了变更:
> git status
位于分支 master
要提交的变更:(使用 "git restore --staged <文件>..." 以取消暂存)修改: .gitmodules新文件: thirdparty/vmtouch
可以看到又一个子模块的entry信息被添加到了.gitmodules
之中,并且多了一个模块的分支信息。
> cat .gitmodules
[submodule "vmtouch"]path = vmtouchurl = https://github.com/hoytech/vmtouch.git
[submodule "thirdparty/vmtouch"] # 第二次添加的子模块path = thirdparty/vmtouchurl = https://github.com/hoytech/vmtouch.gitbranch = support-block-devices # 模块分支
需要注意的是,这里指定仓库的特定分支 不能是tag, tag没有commit记录,而submolue需要通过commit id来区分不同的分支。
如果是用了tag 来当作分支使用,会出现如下问题:
> git submodule add -b v1.3.1 -- https://github.com/hoytech/vmtouch.git thirdparty/vmtouch 正克隆到 '/Users/zhanghuigui/Desktop/submodule_test/thirdparty/vmtouch'... remote: Enumerating objects: 546, done. remote: Total 546 (delta 0), reused 0 (delta 0), pack-reused 546 接收对象中: 100% (546/546), 362.03 KiB | 305.00 KiB/s, 完成. 处理 delta 中: 100% (301/301), 完成. fatal: 'origin/v1.3.1' 不是一个提交,不能基于它创建分支 'v1.3.1' Unable to checkout submodule 'thirdparty/vmtouch'
最后继续执行commit和push ,将结果更新到本地和远程仓库即可。
2.3 场景三:已有仓库,更新子模块内容
工作过程中,我们同样会维护一些自己的一些工作目录,每次重新进入工作目录的时候会有想要更新子模块的需求,或者子模块中有合入了新的feature,我们想要对这个feature做一些测试,这个时候也可能需要变更子模块的分支,或者将最新的代码取下来。
拉取最新的submodue 代码方式
cd vmtouch git fetch # 获取最新的代码 git merge orgin/master # 合并最新的代码
submodule 外部更新数据
git submodule update --remote vmtouch
这个方式,其实也类似于进入submodule ,执行fetch和merge命令
2.4 场景四:已有仓库,变更子模块分支
以上仅仅是更新子模块的当前分支的内容,并不会变更子模块的分支,也就是变更.git目录中的config数据。如果这个时候需要变更子模块的分支,则可以执行如下命令:
# 变更前.gitmodules 配置
> cat .gitmodules
[submodule "vmtouch"]path = vmtouchurl = https://github.com/hoytech/vmtouch.git
[submodule "thirdparty/vmtouch"]path = thirdparty/vmtouchurl = https://github.com/hoytech/vmtouch.gitbranch = support-block-devices# 变更vmtouch 目录的分支配置,默认是master分支
> git config -f .gitmodules submodule.vmtouch.branch support-block-devices
> cat .gitmodules
[submodule "vmtouch"]path = vmtouchurl = https://github.com/hoytech/vmtouch.gitbranch = support-block-devices
[submodule "thirdparty/vmtouch"]path = thirdparty/vmtouchurl = https://github.com/hoytech/vmtouch.gitbranch = support-block-devices
# 执行.gitmodules 中的更新
> git submodule update --remote
Submodule path 'vmtouch': checked out '3111cb1a51a0a556dd86e4a7d4653e6198eb6a95'
> cd vmtouch
> git branch -av # 对应目录已经更新到了support-block-devices 分支
* (3111cb1) 3111cb1 support block devicesmaster 3382336 Merge pull request #78 from johnmay/can_do_mincoreremotes/origin/HEAD -> origin/masterremotes/origin/hp-ux-support 86ad976 Note HP-UX supportremotes/origin/master 3382336 Merge pull request #78 from johnmay/can_do_mincoreremotes/origin/support-block-devices 3111cb1 support block devices
(END)
通过修改.gitmodules 来变更对应submodule 的分支,变更之后.gitmodules文件和对应的子模块目录都会改动
> git status
位于分支 master
要提交的变更:(使用 "git restore --staged <文件>..." 以取消暂存)修改: .gitmodules新文件: thirdparty/vmtouch尚未暂存以备提交的变更:(使用 "git add <文件>..." 更新要提交的内容)(使用 "git restore <文件>..." 丢弃工作区的改动)修改: .gitmodules修改: vmtouch (新提交)
再次commit和push即可。
如果想要看看关于submodule的改动提交日志,可以通过
> git log -p --submodule
commit f19852812f62bbbdc9e916330d78d1021e816818 (HEAD -> master, 0a)
Author: BaronStack <2689496754@qq.com>
Date: Fri Feb 5 15:53:12 2021 +0800[feature] add the vmtouch as submodulediff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..a0e55c0
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "vmtouch"]
+ path = vmtouch
+ url = https://github.com/hoytech/vmtouch.git
Submodule vmtouch 0000000...3382336 (new submodule)commit afac2efb7a6807f08ab7b83a72a4b6348a414f0b
Author: BaronStack <2689496754@qq.com>
Date: Fri Feb 5 15:21:39 2021 +0800[feature] first file touch in repdiff --git a/README.md b/README.md
new file mode 100644
index 0000000..2f723b7
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+#FIRST
2.5 场景五:手动修改.gitmodules不生效问题
可以通过修改.gitmodules文件来增加对应的submodules,需要注意每行的符号
如果用普通的换行符是无法拥有这样的特殊符号的,会导致新添加的submodule 之后无法更新。
建议完整复制之前的submodule entry内容,再在其基础上修改。
或者使用场景二和场景四 来添加新的submodule git submodule add ...
等。
之后再执行git submodule update --remote
3. 总结
关于submodule 的使用基本就是以上几种场景,如果后续还会碰到其他的场景或者问题,欢迎大家留言补充。
相关文章:

Java项目:在线商城系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统功能包括: 前台展示后台管理,包括最基本的用户登录注册,下单, 购物车,购买,结算,订单查询,…

自定义参数解析器,减少10%的代码
*** 赋值调用方法* 如果为空,默认调用name()方法* 该方法必须是一个不含参数的方法,否则将会调用失败* @return*/value() : value用于绑定请求参数和方法参数名一致时的对应关系。比如user?statusNo=1。方法的参数写法如下:getUser(@EnumParam(value=“statusNo”) int status) 或者 getUser(@EnumParam() int statusNo)valueMethod() : 赋值时调用枚举中的方法。

微服务全做错了!谷歌提出新方法,成本直接降9倍!
一位DataDog的客户收到6500万美元的云监控账单的消息,也再次让业界无数人惊到了。事实上有些团队在将集中式单体应用拆分为微服务时,首先进行的往往不是建立领域模型,而只是按照业务功能将原来单体应用的一个软件包拆分成多个所谓的“微服务”软件包,而这些“微服务”内的代码高度耦合,逻辑边界不清晰,长期以来,不管大厂还是小厂,微服务都被认为是云原生服务应用程序架构的事实标准,然而2023,不止那位37signals的DHH决心下云,放弃微服务,就连亚马逊和谷歌等这些云巨头,正在带头开始革了微服务的命。

简述nodejs、npm及其模块在windows下的安装与配置
nodejs的安装 登陆官网http://nodejs.org/,自行安装,不需配置环境变量,安装中自动配置了。 检测是否安装成功,使用cmd输入 node -v 即可查看。 npm的安装 如果是最新版nodejs其实不用装npm,它集成了npm,验证…

discuz,ecshop的伪静态规则(apache+nginx)
discuz(nginx): (备注:该规则也适用于二级目录) rewrite ^([^\.]*)/topic-(.)\.html$ $1/portal.php?modtopic&topic$2 last; rewrite ^([^\.]*)/article-([0-9])-([0-9])\.html$ $1/portal.php?modview&aid$2&page$3 last; rewrite ^([^\.]*)/forum-…

字符串匹配数据结构 --Trie树 高效实现搜索词提示 / IDE自动补全
文章目录1. 算法背景2. Trie 树实现原理2.1 Trie 树的构建2.2 Trie树的查找2.3 Trie树的遍历2.4 Trie树的时间/空间复杂度2.5 Trie 树 Vs 散列表/红黑树3. Trie树的应用 -- 搜索词提示功能1. 算法背景 之前我们了解过单模式串匹配的相关高效算法 – BM/KMP,虽难以理…

Java项目:成绩管理系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统功能包括: 超豪华成绩管理系统,学生,教师,管理员三类用户集 成,课程表管理,成绩查询,成绩详情数据统计…

NSThread 多线程相关
1.下面的代码,有2点需要注意,1>就是 就是thread:所传得参数,这里传得的是nsarray 当然也可以传其他的类型。2> [self performSelectorOnMainThread:selector(update) withObject:nil waitUntilDone:YES]; 这个函数的作用是通知主线程进…

Windows Phone 8初学者开发—第19部分:设置RecordAudio.xaml页面
原文地址: http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Part-19-Setting-up-the-RecordAudioxaml-Page 系列地址: http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners 源代码: http://aka.ms/abs…

9.path Sum III(路径和 III)
Level: Easy 题目描述: You are given a binary tree in which each node contains an integer value. Find the number of paths that sum to a given value. The path does not need to start or end at the root or a leaf, but it must go downwards…

字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法
文章目录1. 算法背景2. AC自动机实现原理2.1 构建失败指针2.2 依赖失败指针过滤敏感词3. 复杂度及完整代码1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 基于多模式串的匹配数据结构Trie树。 1. BM和KMP 单模式串匹配算法细节 2. Trie树 多模式串的高效匹配数…

Java项目:仿小米商城系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统功能包括: 基于vue Springboot前后端分离项目精简版仿小米商城 系统,注册登录,首页展示,商品展示,商品购买,下单…

vb socket的使用
说明:原本在 csdn 博客 写博客的,因为使用的移动宽带,csdn的 博客无法访问,所以先暂时到博客园写博客了 有能解决移动宽带 有部分网站不能访问的问题,请联系我,QQ 809775607 /***************************/ 下面写wins…

不吹牛会死!国内音乐平台进入“大逃杀”
日前,一篇《看看海洋与腾讯音乐将如何“血洗”独立音乐应用》的文章引起了广泛关注。文中海洋声称长期独家签约的音乐及版权代理公司达40多家,占市场份额超过15%,一时间名不见经传的海洋音乐仿佛成了一匹跃然网上的“黑马”。然而据音乐圈深喉…

leetcode网学习笔记(1)
https://leetcode-cn.com/problems/reverse-linked-list/submissions/ 206 反转链表 错误原因:没有考虑到链表为空以及链表只有一个元素的情况 https://leetcode-cn.com/problems/swap-nodes-in-pairs/comments/ 24 两两交换链表 原方法:使用4个指针遍历…

贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码
1. 贪心算法概览 贪心算法是一种算法思想。希望能够满足限制的情况下将期望值最大化。比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用最少的代价找到解决问题的办法。 这个办法就是贪心算法…

Java项目:个人博客系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统功能包括:文章展示、热门文章、文章分类、标签云用户登录评论、匿名评论用户留言、匿名留言评论管理、文章发布、文章管理文章数据统计等等. 二、项目运行 环境…

第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器
第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器 原文:第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器 前言:在前一章已经演示了如何使用SSMS来配置资源调控器。但是作为DBA&a…

Android_开源框架_Volley实例
2019独角兽企业重金招聘Python工程师标准>>> 1.自定义相关类在 Android_开源框架_Volley(Google IO 2013)源代码及内部实现过程分析一文中,简单概述了Volley框架内部实现过程。如想理解彻底应该熟悉 android多线程通信机制( Android_Thread多线程_Handle…

maven的配置-2019-4-13
一.Maven的优点 1. 依赖管理 jar 包管理 2.一键构建 (编译-----测试------打包-----安装-----部署 ) 什么是项目构建? 指的是项目从编译-----测试------打包-----安装-----部署 整个过程都交给maven进行管理,这个过程称为构建 一…

WiredTiger引擎编译 及 LT_PREREQ(2.2.6)问题解决
近期需要为异构引擎做准备, wiredtiger 以其优异的性能(B-tree和LSM-tree都支持)和稳定性(Mongodb的默认存储引擎) 被我们备选为异构引擎里的一个子引擎,后续将深入wiredtiger 引擎原理。这里简单记录一下Wiredtiger 存储引擎的编译记录。 Environment …

Java项目:员工管理系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统功能包括:分为前端翻后端部分,包括用户,区分晋通用户以及誉里员用户,包括首页展示,部门管理,人事管理,…

缺陷重点内容分析
1.缺陷优先级 序号优先级描述1低暂时不影响继续测试,可以在方便时解决2中部分功能测试无法继续测试;需要优先解决3高测试暂停,无法进行,必须立即解决2.缺陷的状态(图片来自云测视频) 3.缺陷生命周期与管理流…

关于node.js的误会
昨天写了篇博客,介绍了一下我对node.js的第一次亲密接触后的感受,以为node.js很小众,出乎我意料很多人感兴趣,并且对博客中的细节问题做了评论,最多的是围绕node.js的异步与单线程展开的,当然还有很多关于n…

文本相关CSS
文本相关CSS 属性 word-breakoverflow-wrap(word-wrap)white-spacetext-overflowtext-wrap(目前主流浏览器都不支持)应用 一般断行需求实现文本不换行,以省略号表示超出的部分参考资料属性 word-break 作用:指定非CJK(中日韩)文本的断行规则。࿰…

Rocksdb 的优秀代码(三)-- 工业级 线程池实现分享
文章目录前言1. Rocksdb线程池概览2. Rocksdb 线程池实现2.1 基本数据结构2.2 线程池创建2.3 线程池 调度线程执行2.4 线程池销毁线程2.5 线程池优先级调度2.6 动态调整线程池 线程数目上限3. 总结前言 Rocksdb 作为一个第三方库的形态嵌入到各个存储系统之中存储元数据&#…

Java项目:网上电商项目(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统功能包括: 一款基于SpringbootVue的电商项目,前后端分离项目,前台后台都有,前台商品展示购买,购物车分类,订 单查…

3月7日 ArrayList集合
ArrayList与数组的区别: 数组是连续的、同一类型数据的一块区域,而集合可以是不连续的、多种数据类型的。 1.ArrayList ArrayList al new ArrayList(); al.Add(3); al.Add(5.09); al.Add("gfdg"); al.Inse…

什么时候出生好?
从年龄来说,女人头一胎的怀孕时间最好在35岁以前,因为过了35岁后不孕和头胎生育缺陷的比例会大幅度升高。那么,从孩子的角度,什么时候出生好?很多人不考虑这个问题,能不能怀上还难说那。迷信的人则追求出生…

数据库搜索与索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。 索引的一个主要目的就是加快检索表中数据&#x…