初探 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来管理. 常用操作 例如, 公 ...
随机推荐
- rest framework ViewSet
ViewSets 路由选择确定要用于一个请求哪个控制器之后,控制器负责做出请求的感并产生相应的输出. - Ruby on Rails的文档 Django的REST框架允许你的逻辑一组在一个类中的相关意 ...
- 04-Spring自定义标签解析
自定义标签的解析 这一篇主要说明自定义标签的解析流程,除了 bean.alias.import.beans之外的标签,都属于自定义标签的范围,自定义标签的解析需要命名空间配合, 获取对应的命名空间 根 ...
- POJ_2387 Til the Cows Come Hom 【最短路】
一.题目 POJ2387 二.分析 Bellman-Ford算法 该算法是求单源最短路的,核心思想就是不断去更新到起点的最短距离,更新的前提是没有负边.如果有负边需要手动控制循环次数. Dijkstr ...
- C#无边框窗体拖动代码
1.重写 protected override void WndProc(ref Message m) { if (m.Msg == 163 && this.ClientRectang ...
- 1、MyBatis教程之环境准备和简介
1.环境准备 jdk 8 + MySQL 5.7.19 maven-3.6.1 IDEA 学习前需要掌握: JDBC MySQL Java 基础 Maven Junit Idea快捷键 一键格式化代碼 ...
- 从本质彻底精通Git——4个模型1个周期1个史观1个工作流
一.什么是Git? Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git是Linus Torvalds为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软 ...
- 【linux】系统编程-3-system-V IPC 信号量
目录 前言 5. 信号量 5.1 概念 5.2 工作原理 5.3 操作函数 5.3.1 semget() 5.3.2 semop() 5.3.3 semctl() 5.4 例程 参考: 前言 原文链接 ...
- 【Papers】Robust Lane Detection via Expanded Self Attention 论文解读
论文题目:Robust Lane Detection via Expanded Self Attention 链接地址:https://arxiv.org/abs/2102.07037 文章核心想要解 ...
- HCL实验8:NAT搭建私有网络
NAT 通过NAT技术,进行私有网络的搭建 拓扑图 先对路由器的端口进行配置 R1 [H3C]sys R1 [R1]INT G0/0 [R1-GigabitEthernet0/0]ip address ...
- Dynamics CRM制作报表的时候让用户可以用自己的权限浏览数据
我们做SSRS报表的时候最头疼的问题就是用Sql查出来的数据都是全部数据没有做权限过滤,导致不同用户看到的数据是一样的. 确实Dynamics CRM产品的数据库时有对这个做处理的,其中每个实体都会有 ...