git submodule 子模块的基本使用
常用命令
| 命令 | 说明 |
|---|---|
git submodule add <url> <本地路径> | 添加子模块 |
git submodule update --init --recursive | 添加子模块后,同步子模块内容 |
git clone <url> --recurse-submodules | 克隆带有子模块的项目 |
git submodule init | 初始化子模块 |
git submodule update | 更新子模块 |
git submodule sync --recursive | 子模块地址变更 |
git submodule deinit <project> | 删除子模块 |
背景
浏览开源库的时候经常会看到如下子模块的引用情况。

子模块通常是项目比较复杂,需要对项目进行拆分,而项目又有引用关系时会使用。通常拆分项目后,我只需要关注自己的项目更改,不需要关注引用的项目都做了哪些更改。
通常这样拆分后,项目就不会在一个 git 仓库中,这时用 submodule 来管理代码仓库会清晰方便许多。
基本使用
添加子模块
git submodule add <url> <本地路径>,例:
git submodule add https://github.com/grassto/example.git example
执行完毕后,发现仓库目录下多了个 example 目录,但是里面没有任何文件,此时需要再执行:
git submodule update --init --recursive
这时会看到仓库有如下变化:
可以看到 .gitmodules 中有如下内容
[submodule "example"]path = exampleurl = https://github.com/grassto/example.git
另外,.git/config 中会多出一块有关子模块的信息
[submodule "example"]active = trueurl = https://github.com/grassto/example.git
同时在 .git/mudules 目录下会多出 .git/mudules/example 目录。
克隆带有子模块的项目
直接 clone 只能拉取主项目的代码,需要多执行下 submodule 相关的命令,如下两种方式:
git clone https://github.com/grassto/example.git --recurse-submodules
先克隆,再初始化子模块拉取
git clone
git submodule init
git submodule update
更新子模块
git submodule update
git submodule update --remote
不添加 --remote 参数,只更新子模块到该仓库使用的最新版本,例:
子模块一直在自己开发,更新了 1.0, 1.1, 1.2 版本,但是这时候我的主仓库只使用了 1.0 版本,使用 git submodule update 更新后,发现只能更新到 1.0 版本。
添加了 --remote 参数,则直接更新到子模块仓库的最新版本。
简单理解就是主仓库使用的就是特定版本的子模块仓库,若要更新,需要主仓库主动进行更新再提交。
子模块地址变动
git submodule sync --recursive
若子模块的 url 发生了改变,这时执行 git submodule update 会失败,可以使用 sync 来同步。
这个我没用过,官网上看到的,这里提一下。
删除子模块
git submodule deinit example
git rm example
git commit -m "delete submodule example"
推荐使用上面这种方式,当然也可以手动删除:
- 删除本地子模块目录
git rm --cached example
rm -rf example
- 删除
.gitmodules子模块信息
[submodule "example"]path = examplehttps://github.com/grassto/example.git
- 删除
.git/config文件中的子模块内容
[submodule "example"]active = truehttps://github.com/grassto/example.git
- 删除
.git文件夹中的相关子模块文件
rm -rf .git/modules/example
总结
- 使用了
submodule后,若不主动更新,项目会一直使用固定版本的submodule模块,需手动更新(git submodule update --remote)。 - 若是在
go或者其他有包管理的项目中,建议还是使用开发语言工具去做这种类似的第三方包管理会比较方便。
其他
作为一个 go 开发,我还是提议使用 go module 来做这种包管理,这里提一下我使用 submodule 的原因:
现在用到了一个包引用的是本地的,使用了 replace 特性,在做 gitlab CI 的时候,需要同步代码仓库,感觉不方便,顾使用了 git submodule 将代码作为子模块。这样就可以使用 gitlab 的 GIT_SUBMODULE_STRATEGY: recursive 特性。
如果你也是个 go 开发人员,这里不建议这么用,因为 go module 是可以引用私有库的,我这样用是有历史原因的。
我需要引用的库的 go.mod 如下,module 的 name 是 example 而不是 github.com/example
module examplego 1.18require ......
使用该模块的时候都是将其拉到本地,然后 replace。
module workgo 1.18replace example => ./example
参考
- 官方文档 Git-Tools-Submodules
- Git中submodule的使用
相关文章:
git submodule 子模块的基本使用
常用命令 命令说明git submodule add <url> <本地路径>添加子模块git submodule update --init --recursive添加子模块后,同步子模块内容git clone <url> --recurse-submodules克隆带有子模块的项目git submodule init初始化子模块git submodule…...
四层负载均衡的NAT模型与DR模型推导 | 京东物流技术团队
导读 本文首先讲述四层负载均衡技术的特点,然后通过提问的方式推导出四层负载均衡器的NAT模型和DR模型的工作原理。通过本文可以了解到四层负载均衡的技术特点、NAT模型和DR模型的工作原理、以及NAT模型和DR模型的优缺点。读者可以重点关注NAT模型到DR模型演进的原…...
【vue】vue前端实现随机验证码(数字、字母混合)功能
效果图:使用canvas组件对随机的数字字母添加插画背景、干扰线、干扰点 1、在components文件夹下新建securityCode.vue文件,代码: <template><canvas id"s-canvas" :width"contentWidth" :height"contentH…...
使用Visual Studio 2022实现透明按钮和标签、POPUP样式窗体的一种工业系统的UI例程
例程实现的功能说明 1、主窗体采用POPUP样式,无标题栏、无菜单栏,适合工业类软件 2、按钮、标签使用自绘,实现透明样式,可以实现灵活的样式设计,更具设计感 按钮重绘函数:OnDrawItem()按钮样式设定&#…...
【爬虫】7.1. JavaScript动态渲染界面爬取-Selenium
JavaScript动态渲染界面爬取-Selenium的简单学习 文章目录 JavaScript动态渲染界面爬取-Selenium的简单学习1. Selenium准备工作2. Selenium简单用法2.1. 初始化浏览器对象-webdriver.Chrome()2.2. 访问界面-browser.get()2.3. 查找节点-find_element()2.4. 节点交互-send_keys…...
菜鸟教程《Python 3 教程》笔记(12):推导式
菜鸟教程《Python 3 教程》笔记(12) 12 推导式12.1 列表推导式12.2 字典推导式12.3 集合推导式12.4 元组推导式(生成器表达式) 笔记带有个人侧重点,不追求面面俱到。 12 推导式 出处: 菜鸟教程 - Python3 …...
MAC修改python3命令为py
1, 找到python3安装路径 2, vi ~/.bash_profile 3, 增加内容: alias py“/usr/bin/python3” 4, 重载source ~/.bash_profile 5,执行py...
Windows下Git Bash调用rsync
rsync 提供了补充只需要在git安装目录下放入对应的文件即可。 需要将这个三个文件放到git的bin目录下 如果是默认安装路径是如下: C:\Program Files\Git\usr\bin 然后大功告成。...
springboot自定义事件发布及监听
自定义线程池 Configuration public class MyThreadPool {//ThreadPoolTaskExecutor不会自动创建ThreadPoolExecutor,需要手动调initialize才会创建。如果Bean就不需手动,会自动InitializingBean的afterPropertiesSet来调initializeBean("myExecut…...
手写RPC框架--2.介绍Zookeeper
RPC框架-Gitee代码(麻烦点个Starred, 支持一下吧) RPC框架-GitHub代码(麻烦点个Starred, 支持一下吧) 该项目的RPC通信将采用NettyZookeeper,所以会在前两章介绍使用方法 介绍Zookeeper Zookeepera.概述1) 数据模型2) Watcher机制 b.安装和基本操作1) Java操作zooke…...
Docker harbor 私有仓库的部署和管理
目录 一、什么是Harbor 二、Harbor的特性 三、Harbor的构成 四、部署配置Docker Harbor 1. 首先需要安装 Docker-Compose 服务 2.部署 Harbor 服务 3.使用harbor仓库 (1)项目管理 (2)用户管理 一、什么是Harbor Harbor …...
从零开始搭建AI网站(6):如何使用响应式编程
响应式编程(Reactive Programming)是一种编程范式,旨在处理异步数据流和事件流。它通过使用观察者模式和函数式编程的概念,将数据流和事件流抽象为可观察的序列,然后通过操作这些序列来实现各种功能。 在响应式编程中…...
MPI之虚拟进程拓扑
什么是虚拟进程拓扑 在很多并行应用进程中,进程的线性排列不能充分的反映进程间在逻辑上的通信模型,通常由问题几何和所用的算法决定,进程经常被排列成二维或者三维网络形式的拓扑模型而通常用一个图来描述逻辑进程排列,此种逻辑…...
Three.js相机参数及Z-Fighting问题的解决方案
本主题讨论透视相机以及如何为远距离环境设置合适的视锥体。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 透视相机是一种投影模式,旨在模仿人类在现实世界中看待事物的方式。 这是渲染 3D 场景最常用的投影模式。 - three.js 如果你看一下 Three.js 文档…...
微信小程序食疗微信小程序的设计与实现
摘要 现在人们的生活水平高了,大家都想在多活个几十年,要想实现这个想法,有很多事情都必须考虑到,第一个就是适当运动,第二个就是心情好,第三个就是要注意饮食。民以食为天,科学合理的饮食结构是…...
mac环境使用pkgbuild命令打pkg包的几个小细节
mac环境使用pkgbuild命令打pkg包的几个小细节 最近,研发提出要使用jenkins来自动生成mac环境下的pkg包,研究了一下,可以使用pkgbuild来打包。但是有几个小细节需要注意一下: 1 如果有pre-install和post-install脚本,…...
在 Spring Boot 中集成 MinIO 对象存储
MinIO 是一个开源的对象存储服务器,专注于高性能、分布式和兼容S3 API的存储解决方案。本文将介绍如何在 Spring Boot 应用程序中集成 MinIO,以便您可以轻松地将对象存储集成到您的应用中。 安装minio 拉取 minio Docker镜像 docker pull minio/minio创…...
seq2seq与引入注意力机制的seq2seq
1、什么是 seq2seq? 就是字面意思,“句子 到 句子”。比如翻译。 2、seq2seq 有一些特点 seq2seq 的整体架构是 “编码器-解码器”。 其中,编码器是 RNN,并将 最后一个hidden state(隐藏状态)【即&…...
【zookeeper】zookeeper介绍
分布式协调技术 在学习ZooKeeper之前需要先了解一种技术——分布式协调技术。那么什么是分布式协调技术?其实分布式协调技术主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成"脏数据"的…...
2023高教社杯数学建模思路 - 案例:ID3-决策树分类算法
文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模…...
Qwen3-0.6B-FP8辅助Java八股文学习:智能抽题与答案要点生成
Qwen3-0.6B-FP8辅助Java八股文学习:智能抽题与答案要点生成 1. 引言:当面试备考遇上AI 准备Java面试,尤其是那些经典的“八股文”题目,对很多程序员来说是个既熟悉又头疼的过程。你可能也经历过:面对厚厚的面试宝典&…...
OpenClaw私有化方案:Qwen3-VL:30B+飞书自动化助手实战
OpenClaw私有化方案:Qwen3-VL:30B飞书自动化助手实战 1. 为什么选择私有化AI助手 去年我接手了一个特殊项目:需要将公司内部的技术文档自动整理成知识库,并推送到飞书文档。这个需求看似简单,但涉及几个棘手问题:文档…...
智能配置引擎如何攻克AMD黑苹果的三大技术壁垒
智能配置引擎如何攻克AMD黑苹果的三大技术壁垒 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在黑苹果领域,AMD平台曾被视为技术禁区&…...
StructBERT文本相似度模型在互联网内容治理中的应用:重复与低质内容识别
StructBERT文本相似度模型在互联网内容治理中的应用:重复与低质内容识别 你有没有遇到过这样的情况?打开一个内容平台,满屏都是大同小异的文章,或者点开几篇帖子,发现内容似曾相识,只是换了几个词。对于平…...
4步掌握AI图像修复新工具:IOPaint从入门到精通指南
4步掌握AI图像修复新工具:IOPaint从入门到精通指南 【免费下载链接】IOPaint 项目地址: https://gitcode.com/GitHub_Trending/io/IOPaint AI图像修复技术正在改变我们处理数字图像的方式,从简单的水印去除到复杂的老照片修复,都可以…...
论文降AI完成后怎么跟导师解释文字变化:沟通话术和注意事项
论文降AI完成后怎么跟导师解释文字变化:沟通话术和注意事项 这是一篇我自己也会反复翻看的教程。因为每次帮朋友降AI的时候,总有些细节差点忘记。 用的工具是嘎嘎降AI(www.aigcleaner.com),4.8元一篇,达标…...
用OB_Template实现笔记高效管理与知识沉淀:从入门到精通
用OB_Template实现笔记高效管理与知识沉淀:从入门到精通 【免费下载链接】OB_Template OB_Templates is a Obsidian reference for note templates focused on new users of the application using only core plugins. 项目地址: https://gitcode.com/gh_mirrors/…...
基于Node.js构建HunyuanVideo-Foley模型调度与管理中间件
基于Node.js构建HunyuanVideo-Foley模型调度与管理中间件 1. 引言:音效生成服务的挑战与机遇 在视频制作和游戏开发领域,高质量的音效生成(HunyuanVideo-Foley)已成为提升作品沉浸感的关键要素。随着AI模型能力的提升,单个音效生成请求的处…...
如何通过智能备份技术实现微信聊天记录的数据主权?本地化管理方案全解析
如何通过智能备份技术实现微信聊天记录的数据主权?本地化管理方案全解析 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_…...
终极存储设备容量检测指南:如何用F3工具3分钟识别假冒U盘和SD卡
终极存储设备容量检测指南:如何用F3工具3分钟识别假冒U盘和SD卡 【免费下载链接】f3 F3 - Fight Flash Fraud 项目地址: https://gitcode.com/gh_mirrors/f3/f3 在数字存储时代,容量造假已成为困扰用户的普遍问题。F3(Fight Flash Fra…...
