初探 Git Submodules
之前一直想将一个 Git 仓库放到另一个 Git 仓库,有 Maven 多模块项目(Maven Multimodule Project)和 Gradle 多项目构建(Gradle Multiproject Build)那味儿。Git 这么骚,肯定也可以。“扫”了多个开源仓库,Get 到了 Git submodule 可以做这种操作,水篇文章记录波。
没有使用 Git Submodules 之前
没有使用 submodule 之前,如果在一个 Git 项目追踪另一个 Git 项目,会报一个 warning「我敲,有暗示用 submodule,之前没注意」,操作如下:
mkdir git-submodule
cd git-submodule
git init
git clone https://github.com/volantis-x/hexo-theme-volantis --depth 1
执行 git add hexo-theme-volantis,会出现如下 warning(adding embedded git repository):

然后使用 git status 查看,虽然 git add 成功了,但是并没有成功 add 到 hexo-theme-volantis 里面的内容。提示也说了(will not contain the contents of the embedded repository),提交到 GitHub 后,显示结果如下, folder 戳也戳不开。

可以明显的看到,并不能保证 子目录/文件 的完整性。就我之前如果想在一个 Git 项目保留另一个 Git 项目,那么我只能将一个项目的 Git 版本库去掉,从后续的使用感受来看,此后我追踪另一个项目的更新会有点麻烦。从 yeshan333/actions-for-hexo-blog 项目的对 volantis 项目追踪的历史commit@3ce9316 可以看得出来
Git Submodules 的作用
是时候该见识 submodule 的作用了,从官方文档可以看到,它可以解决之前上面提到的一些问题。略微概括下就是:
- Git的 submodule 可以将一个 Git 版本库作为一个子目录保存在另一个 Git 版本库中,并可以保留两个版本库之间 commit 的分离,保持父项目和子项目相互独立,实现更为精确的版本控制。
Git Submodules 的本质
拿 actions-for-hexo-blog 项目来实践感受下 submodule。操作如下:
git clone git@github.com:yeshan333/actions-for-hexo-blog.git && cd actions-for-hexo-blog
git submodule add git@github.com:volantis-x/hexo-theme-volantis.git themes/volantis
执行上述命令之后,会看到当前项目下生成了个 .gitmodules 文件,内容如下:
[submodule "themes/volantis"]
path = themes/volantis
url = git@github.com:volantis-x/hexo-theme-volantis.git
同时,.git/config 文件也会被追加写入如下内容:
[submodule "themes/volantis"]
url = git@github.com:volantis-x/hexo-theme-volantis.git
active = true
再看看 theme/volantis 目录,发现该项目的 Git 版本库不见了,之前提到 git submodule 可以保留两个版本库之间 commit 的分离,那么项目 volantis 的版本库放哪了?摸索下当前项目的版本库可以看到被放在了 .git/modules/themes/volantis 下。尝试提交到 GitHub 看看。

emm......,收工,目录名显示多个 commit 引用,可以进行跳转。
更多操作
- 与 submodule 类似的 subtree:Git Submodules vs Git Subtrees
- 子模块更新:
git submodule update - submodule 最佳实践
# 子模块删除
- 删除.gitsubmodule文件中子模块的相关字段;
- 删除.git/config文件中子模块的相关字段;
- 删除模块目录:
- git rm --cached <submodule-path>
参考
初探 Git Submodules的更多相关文章
- Using Git Submodules
NOTE: Following content is directly reprinted from http://patrickward.com/2013/01/09/using-git-submo ...
- Git 内部原理--初探 .git
说到Git大家应该都非常熟悉,几乎每天都会用到它.在日常使用过程中,我们貌似并不需要关注其内部的原理,只需要记住那几个常用的命令,就可以说自己是会Git的人了.可是,事实真的是这样子的吗?今天我们就来 ...
- Git Submodules are not SVN Externals
一直在寻找Git跟TFS里面类似SVN Externals的替代方案, 今天终于找到了GIT里面的替代方案,在此做个备注 http://alexking.org/blog/2012/03/05/git ...
- Git学习笔记(2)-初探Git
1.创建版本库 (1)设置Git的配置变量.这些设置会在全局文件(.gitconfig)或系统文件(/etc/gitconfig)中做永久记录 $ git config --global user.n ...
- git submodule 使用
这个是备忘录,原网页: https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407 http://cncc.bingj.c ...
- git subtree 使用
这个是备忘录.原网页(https://medium.com/@porteneuve/mastering-git-subtrees-943d29a798ec , http://cncc.bingj.co ...
- GIT之旅【第一篇】
初探git Linus Torvalds在2002年起,使用BitMover的版本控制软件BitKeeper管理Linux核心开发,而因为BitKeeper除商业付费版本,仅提供可免费使用但不允许修改 ...
- Git - Tutorial官方【转】
转自:http://www.vogella.com/tutorials/Git/article.html#git_rename_branch Lars Vogel Version 5.8 Copyri ...
- Git submodule实战
http://blog.jqian.net/post/git-submodule.html 使用git管理的项目开发中,如果碰到公共库和基础工具,可以用submodule来管理. 常用操作 例如, 公 ...
随机推荐
- C# 通过ServiceStack 操作Redis——String类型的使用及示例
1.引用Nuget包 ServiceStack.Redis 我这里就用别人已经封装好的Reids操作类,来演示,并附上一些说明 RedisConfigInfo--redis配置文件信息 /// < ...
- POJ_2828 Buy Tickets 【线段树】
一.题目 Buy Tickets 二.分析 首先可以明确的是每个人的位置都是定的,那么如果从输入数据从后往前看,最后面的人进来的时候,他前面的人数肯定是定的. 那么可以考虑,当从后往前推时,这个人插入 ...
- python inspect库
一.介绍 inspect模块用于收集python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈,对对象进行类型检查等等. inspect模块主要提供了四种用处: 对是否是模块.框架.函数进行 ...
- HDU-6862 Hexagon (2020HDU 多校 D8 H)
1008 题意:半径为n的六边形(由半径为1的小六边形组成),从某一个小六边形出发有六个方向,找到一条转向次数最多的路径(用方向表示)遍历所有的六边形(一个六边形只访问一次). 题解:先画出n=3/4 ...
- 【Django笔记1】-视图(views)与模板(templates)
视图(views)与模板(templates) 1,视图(views) 将接收到的数据赋值给模板(渲染),再传递给浏览器.HTML代码可以直接放在views.py(文件名可任意更换),也可以放在t ...
- RabbitMQ 入门 (Go) - 1. 简介和安装
Message Broker(消息代理) 维基百科对 Message Broker 的定义是:Message broker 是一种中介程序模块,它把消息从发送方的正式消息传递协议转化为接收方的正式消息 ...
- ASPOSE.Cells & ASPOSE.Words 操纵Excel和Word文档的 .NET Core 实例
Aspose.Total是Aspose公司旗下的最全的一套office文档管理方案,它提供的原生API可以对Word.Excel.PDF.Powerpoint.Outlook.CAD.图片.3D.ZI ...
- Java学习之String与int的相互转换
•String 转 int 两种方式 int a = Integer.parseInt(s);int b = Integer.valueOf(s).intValue(); 代码 public clas ...
- Oauth2协议那些事
1. 背景 首先,设想一种情境:你平常会使用一款照片存储App(以下照片服务指代),用来将自己喜欢的照片存放在上面以备随时查看.假如有一天,你想要打印其中的某张照片而且你找到了一款打印照片App(以下 ...
- KeyError:‘uid' Python常见错误
使用不存在的字典键值 检查字典和要查的内容 如有不正确改正即可