初探 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来管理. 常用操作 例如, 公 ...
随机推荐
- hibernate 中持久化标识 OID
OID 全称是 Object Identifier,又叫做对象标识符 是 hibernate 用于区分两个对象是否是同一个对象的标识的方法 标识符的作用:可以让 hibernate 来区分多个对象是否 ...
- vue之mixin理解与使用
使用场景 当有两个非常相似的组件,除了一些个别的异步请求外其余的配置都一样,甚至父组件传的值也是一样的,但他们之间又存在着足够的差异性,这时候就不得不拆分成两个组件,如果拆分成两个组件,你就不得不冒着 ...
- Netflix业务运维分析和总结
目录 Netflix工作环境的分析和思考 为什么Netflix会做得如此极致? 海量业务规模下的技术架构和挑战 更加合理的组织架构和先进的工具体系及理念 自由与责任并存的企业文化 当前问题: 精选提问 ...
- servlet学习(一)
Tomcat 注:以下资料摘自孙鑫的<sevlet/JSP深入详解>,仅用于个人学习使用. 一.web技术的发展 早期web是静态页面的浏览,使用HTML编写,放入服务器. 1.1浏览器请 ...
- IDEA 主题下载
IDEA中主题可以更换,大家可以直接到 http://www.riaway.com/ 网站或 http://color-themes.com/?view=index 网站,直接下载自己喜欢的主题. ...
- Java(152-170)【继承、super、this、抽象类】
1.继承的概述 继承是多态的前提 继承主要解决的问题是共性抽取 2.继承的格式 在继承的关系中,子类可以当做父类看待 代码复用的效果 package cn.itcast.day09.demo01; / ...
- 「SpringBoot2.4新特性」jar自动瘦身
自动分析瘦身 Spring Boot 项目最终构建处理 JAR 包大小一直是个诟病,需要把所有依赖包内置最终输出可运行的 jar. 当然可以使用其他的插件扩展 实现依赖 JAR 和 可运行 jar 分 ...
- 记一次go中map并发引起的事故
错误使用map引发的血案 前言 场景复原 原因 参考 错误使用map引发的血案 前言 最近业务中,同事使用map来接收返回的结果,使用waitGroup来并发的处理执行返回的结果,结果上线之后,直接崩 ...
- 超详细网站博客域名和二级域名、子域名升级HTTPS免费申请SSL证书配置nginx指南
随着互联网的飞速发展,我们的工作生活已经离不开互联网,HTTP虽然使用极为广泛, 但是存在不小的安全缺陷, 主要是其数据的明文传送和消息完整性检测的缺乏, 而这两点恰好是网络支付,网络交易等网站应用中 ...
- 利用Apache部署静态网站(二)
本文接着<利用Apache部署静态网站(一)>继续部署,为系统中的每位用户创建一个独立的网站. httpd服务程序提供的个人用户主页功能可以为每位用户创建一个独立的网站.该功能可以让系统内 ...