之前一直想将一个 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 引用,可以进行跳转。

更多操作

# 子模块删除
- 删除.gitsubmodule文件中子模块的相关字段;
- 删除.git/config文件中子模块的相关字段;
- 删除模块目录:
- git rm --cached <submodule-path>

参考

最新文章

  1. 如何在使用itext生成pdf文档时给文档添加背景图片
  2. 免费而优秀的图表JS插件
  3. 微信公众平台创建自定义菜单中文编码导致system error
  4. Struts1 action重定向跳转 带参数
  5. PHP 错误与异常 笔记与总结(8)自定义错误处理函数 set_error_handler()
  6. http_load的安装及使用方法
  7. Node.js V0.12 新特性之性能优化
  8. javaWeb中的/路径问题
  9. Dynamic Library Design Guidelines
  10. Appium移动自动化测试(一)--安装Appium(转)
  11. mysql学习之五:sql语句学习3
  12. git submodule 使用过程中遇到的问题
  13. Shell命令-文件及内容处理之iconv、dos2unix
  14. Delphi中播放Flash
  15. [LINQ] group by 与连接查询
  16. 老男孩python学习自修第十天【三元表达式与lambda表达式】
  17. (replace find)nyoj113-字符串替换
  18. setvlet基础知识
  19. centos7 firewall-cmd 用活firewalld防火墙中的zone
  20. selenium测试(Java)-- 验证信息(八)

热门文章

  1. POJ_2828 Buy Tickets 【线段树】
  2. OpenGL光照计算中法线矩阵原理及推到过程
  3. SQL排名问题,100% leetcode答案大公开!
  4. Python基础之:Python中的异常和错误
  5. Amundsen在REA Group公司的应用实践
  6. XML数据持久化学习笔记
  7. Android Studio 之 制作 Nine-Patch 图片(.9图片)
  8. Alluxio+HDFS+MapReduce集成及测试
  9. java面试一日一题:mysql事务是如何实现的
  10. C# List常用方法及Dictionary常用方法汇总