Git: submodule 子模块简明教程

news/2025/2/10 13:06:44/文章来源:https://www.cnblogs.com/RioTian/p/18707633

有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。

Git 通过子模块来解决这个问题。 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。


添加子模块

添加一个远程仓库项目 https://github.com/RivTian/testSubmodule.git 子模块到一个已有主仓库项目中。代码形式是 git submodule add <url> <repo_name>, 如下面的例子:

$ git submodule add https://github.com/RivTian/testSubmodule.git toolKit

这时,你会看到一个名为 toolKit 的文件夹在你的主仓库目录中。

如果你是旧版 Git 的话,你会发现 ./toolKit 目录中是空的,你还需要在执行一步「更新子模块」,才可以把远程仓库项目中的内容下载下来。

$ git submodule update --init --recursive

如果你不小心把路径写错了,可以用下面的代码来删掉,详细可查阅 git help submodule。

$ git rm --cached toolKit

添加子模块后,若运行 git status,可以看到主仓库目录中会增加一个文件 .gitmodules,这个文件用来保存子模块的信息。

$ git statusOn branch main
Your branch is up to date with 'origin/main'.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file:   .gitmodulesnew file:   toolKit

另外,在 .git/config 中会多出一块关于子模块信息的内容:

[submodule "toolKit"]url = https://github.com/RivTian/testSubmodule.gitactive = true

该配置文件保存了项目 URL 与已经拉取的本地目录之间的映射。如果有多个子模块,该文件中就会有多条记录。 要重点注意的是,该文件也像 .gitignore 文件一样受到(通过)版本控制。 它会和该项目的其他部分一同被拉取推送。 这就是克隆该项目的人知道去哪获得子模块的原因。

新生成的还有相关子模块的文件:.git/modules/toolKit/。

此时若把上述「添加子模块」的修改更新到主仓库的 GitHub 上去的话,会看到相应子模块仓库的文件夹图标会有些不同:

此时还要留意的是,在终端 Git 命令操作下,位于主仓库目录中除了子模块外的任何子目录下进行的 commit 操作,都会记到主仓库下。只有在子模块目录内的任何 commit 操作,才会记到子模块仓库下。如下面的示例:

$ cd ~/projects/<module>
$ git log # log shows commits from Project <module>
$ cd ~/projects/<module>/<sub_dir>
$ git log # still commits from Project <module>
$ cd ~/projects/<module>/<submodule>
$ git log # commits from <submodule>

查看子模块

$ git submodule
-9bec2371404a07b1c3d94af8fdef6093e936be71 toolKit

更新子模块

更新项目内子模块到最新版本:

$ git submodule update

更新子模块为远程项目的最新版本

$ git submodule update --remote

Clone 包含子模块的项目

对于你的主仓库项目合作者来说,如果只是 git clone 去下载主仓库的内容,那么你会发现子模块仓库的文件夹内是空的!

此时,你可以像上面「添加子模块」中说到的使用 git submodule update --init --recursive 来递归的初始化并下载子模块仓库的内容。

也可以分初始化和更新子模块两步走的方式来下载子模块仓库的内容:

$ git submodule init		# 初始化子模块
$ git submodule update	# 更新子模块

但是,如果你是第一次使用 git clone 下载主仓库的所有项目内容的话,我建议你可以使用如下的代码格式来把主仓库和其中子模块的所有内容,都一步到位的下载下来:

$ git clone --recursive <project url>

以后可以在子模块仓库目录下使用 git pull origin main 或者 git push 等来进行更新与合并等操作。

删除子模块

删除子模块比较麻烦,需要手动删除相关的文件,否则在添加子模块时有可能出现错误 同样以删除 toolKit 子模块仓库文件夹为例:

  1. 删除子模块文件夹
$ git rm --cached toolkit
$ rm -rf toolKit
  1. 删除 .gitmodules 文件中相关子模块的信息,类似于:
[submodule "toolKit"]path = toolKiturl = https://github.com/RivTian/testSubmodule.git
  1. 删除 .git/config 中相关子模块信息,类似于:
[submodule "toolKit"]url = https://github.com/RivTian/testSubmodule.gitactive = true
  1. 删除 .git 文件夹中的相关子模块文件
$ rm -rf .git/modules/toolKit

最后的话

  • 虽然 Git 提供的子模块功能已足够方便好用,但仍请在为主仓库项目添加子模块之前确保这是非常必要的。毕竟有很多编程语言(如 Go)或其他依赖管理工具(如 Ruby’s rubygems, Node.js’ npm, or Cocoa’s CocoaPods and Carthage)可以更好的 handle 类似的功能。

  • 主仓库项目的合作者并不会自动地看到子模块仓库的更新通知的。所以,更新子模块后一定要记得提醒一下主仓库项目的合作者 git submodule update。

参考资料

  • Working with submodules
  • Git 工具 - 子模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881644.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内外网文件交换与数据共享系统:企业级跨网高效传输解决方案

一、产品介绍 产品定位:可以实现在企业内外网物理隔离情况之下,进行文件的安全交换(导入文件、刻录文件)、进行在线审批流程、实现在线审计、并对传输文件进行实施病毒查杀。 产品介绍:内外网安全文件交换系统是企业内部实现高效文件传输的管理系统: 1.支持用户通过光盘导…

EXCEL根据字体颜色排序 ,颜色相同的集中显示在最上面

自定义排序--选择指定列--选择 字体颜色 --相应颜色--在顶端以集中显示 结果如下图:

conda创建环境之后只有空荡荡的文件夹

如题 在创建环境之后,在该环境的文件夹中只有conda-meta和etc两个文件夹变成这样的原因是在创建虚拟环境的时候只是执行了 conda create -n test 而正确的应该是执行 conda create -n test python 若指定python版本应该加上 conda create -n test python=

FireDAC数据库连接流程图

FireDAC数据库连接流程图

老年人评估进程三

2025年2月9日 今天我们基本完成了老年人评估系统的功能,其中我后端遇到的问题,我觉得 是mapper层与xml映射文件的对接,这里命名我是按照规定进行创建和设置的, 但是在最后监护人页面的多条件查询时,出现了问题:mybatis参数映射出现 了问题,找不到Mappe接口等问题,最后无…

【日记】给了朝哥他们一家五百多块的购物卡(1568 字)

正文我从来都不知道背转在旋转的时候手和腿还要发力……前天上了年后的第一次课。课上朝哥原本打算教我背转,教给我需要注意的点。但他说的背转过程中还要发力,这真的超乎我的想象。说是背转,其实也没有练习多久。因为最后课上还是让我试试推风车,看看哪里有问题。如自己所…

3.3 计算机运算出错的原因

计算机运行出错的原因是因为 有一些十进制数的小数无法转换成二进制数因为无法正确表示的数值,最后都变成了近似值 因此,在遇到循环小数时,计算机会根据变量数据类型所对应的长度将数值从中间截断或者四舍五入

3.2 用二进制数表示小数

1011.0011这个有小数点的二进制数转换成十进制数 小数点前面的部分 将各数位数值和位权相乘,然后再将相乘的结果相加即可实现 小数点后面的处理和整数部分是一样的0次幂前面的位的位权按照1次幂、2次幂.....的方式递增 0次幂以后的位的位权按照-1次幂、-2次幂.....的方式递减 …

CF475E 证明

考虑观察最优解的一些性质:性质 1:一个非叶子节点的入度和出度非 0。 证明:显然把任意一条邻边翻转之后会更优。性质 2:若 \(x\) 可达 \(y\),则 \(out_x>1\) 和 \(in_y>1\) 不会同时成立。 证明:如图,设能到 \(x\) 的点数为 \(A\),\(x\) 能到达的点数为 \(B\)(不…

浏览量超 10w 的热图,描述 RAG 的主流架构

这张图近期在国外社区传播比较多,结构化的描述了 RAG 的主流架构。RAG 用于提升大模型的生成效果,使得大模型更加智能,而持续提升的大模型语义和逻辑推理能力,又能更加精准的识别和应用专业知识库。本文将梳理 RAG 的基本信息,旨在获得更加清晰的理解。作者:望宸 大模型性…

redis 为什么把简单的字符串设计成 SDS

redis是用C写的,但它却没有完全直接使用C的字符串,而是自己又重新构建了一个叫简单动态字符串SDS(simple dynamic string)的抽象类型。 redis也支持使用C语言的传统字符串,只不过会用在一些不需要对字符串修改的地方,比如静态的字符输出。 SDS结构 一个SDS值的数据结构,…