Git 子模块:git submodule
2018年03月08日阅读 2057
Git 子模块:git submodule
工作中,可能会遇到在一个Git仓库 中添加 其他 Git 仓库的场景。比如,在项目中引用第三方库。或者在模块化开发中,某些公共的模块是需要单独维护的,使用单独的仓库比较方便,但是在项目中需要引用,就会出现这样的场景。这里使用 Git 的 git submodule 命令为一个 git 项目 添加 子git项目。
可以使用 git submodule --help 查看所有相关命令。 为了方便说明,这里在主项目 MainProject中加两个子模块 liba 和 libb .
1. 添加子模块
进入 MainProject 使用 git submodule add 进行添加,操作命令:
git clone https://github.com/imtianx/MainProject.git
cd MainProject/
git submodule add https://github.com/imtianx/liba.git
复制代码
如下图:
使用 git submodule add https://github.com/imtianx/libb.git 添加 libb 子模块。 对于上图,文件夹 liba 为新增加的子模块目录, .gitmodules 中存放的为子模块的信息,使用 cat 或 vim查看内容为:
[submodule "liba"]
path = liba
url = https://github.com/imtianx/liba.git
[submodule "libb"]
path = libb
url = https://github.com/imtianx/libb.git
复制代码
.gitmodules文件:保存项目 URL 与已经拉取的本地目录之间的映射,有多个子模块则含有多条记录,会随着版本控制一起被拉去和推送的。
此时文件目录树如下:
.
├── README.md
├── liba
│ ├── README.md
│ ├── a.txt
│ └── a2.txt
├── libb
│ ├── README.md
│ ├── b.txt
│ └── b2.txt
└── test.text
复制代码
最后,提交添加的子模块到主目录
$ git commit -m "add liba and libb submodules"
[master 6b15e30] add liba and libb submodules
3 files changed, 8 insertions(+)
create mode 100644 .gitmodules
create mode 160000 liba
create mode 160000 libb
复制代码
2. 更新子模块
往往子模块是单独开发的,这里以更新 liba 为例(为了测试,这里先在liba仓库添加了一个文件):
cd liba/
git fetch
git merge origin/master
复制代码
操作结果如下图,注意需要进入子模块目录:
此外,还可以在主目录下 直接用下面的命令更新 libb子模块:
git submodule update --remote liba
复制代码
使用下面的方式,更新 libb 的 dev 分支:
git config -f .gitmodules submodule.liba.branch dev
git submodule update --remote
复制代码
如下图:
这里对
.gitmodules加了-f参数,修改提交后对所有用户有效。
3. 删除子模块
在日常开发中,有添加,当然也会有删除 子模块的需求。 这里主项目包含两个子模块:liba、libb,以删除 liba 为例说明:
- 使用
git rm --cached liba将liba 从版本控制中删除(本地仍保留有),若不需要可不带--cached进行完全删除。 - 使用
vim .gitmodules可打开vim编辑,删除对应的内容
[submodule "liba"]
path = liba
url = https://github.com/imtianx/liba.git
branch = dev
复制代码
- 使用
vim .git/config可打开vim编辑,删除对应的内容
[submodule "liba"]
url = https://github.com/imtianx/liba.git
active = true
复制代码
- 使用
rm -rf .git/modules/liba, 删除.git下的缓存模块,最后提交项目。
经过上面的删除后还可以进行添加子模块。
4. 克隆含子模块的仓库
若需要克隆含有子模块的仓库,直接 进行克隆是无法拉取之模块的代码,可加上 --recursive 参数,如下:
git clone --recursive https://github.com/imtianx/MainProject.git
复制代码
或者使用下面的三部操作:
git clone https://github.com/imtianx/MainProject.git
git submodule init
git submodule update
复制代码
更多子模块的操作,请参考官方文档:Git 工具 - 子模块
Git 子模块:git submodule的更多相关文章
- Git 子模块 - submodule
有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另 ...
- Git 子模块 - submodule(转)
原文地址: http://www.cnblogs.com/kelsen/p/5918672.html 有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开 ...
- git子模块submodule
添加submodule: git submodule add 子模块git地址 把这个module放置的文件夹(这个文件夹须事先不存在) git submodule add http://xxx.x ...
- git 工具 - 子模块(submodule)
From: https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97 子模块 有种情况我们经常 ...
- git submodule git 子模块管理相关操作
Git 子模块操作相关的一些命令备忘: # 当使用git clone下来的工程中带有submodule时,初始的时候 submodule的内容并不会自动下载下来的,需执行如下命令: git submo ...
- Git子模块引用外部项目
Git子模块(submodule)简介 经常有这样的事情,当你在一个项目上工作时,你需要在其中使用另外一个项目.也许它是一个第三方开发的库或者是你独立开发和并在多个父项目中使用的.这个场景下一个常见的 ...
- jenkin+Git子模块自动拉取代码
jenkins+Git子模块自动拉取代码 添加Git子模块 先克隆想要添加子模块的仓库git clone ssh://git@ip:port/user/project.git,这个是主目录. 进入仓库 ...
- 手把手教你把 Git 子模块更新到主项目
本文以 skywalking-rocketbot-ui子模块合并到 skywalking 为例,手把手教你如何把 Git 子模块更新到主项目中去. 首先,把fork的skywalking项目克隆到本地 ...
- git子模块的使用
1. 在项目中添加子模块 命令: git submodule add <url> 例子: git submodule add https://github.com/chaconinc/Db ...
随机推荐
- Understanding How Graal Works - a Java JIT Compiler Written in Java
https://chrisseaton.com/truffleruby/jokerconf17/ https://chrisseaton.com/truffleruby/tenthings/ http ...
- T-Pot平台Honeytrap蜜罐TCP/UDP服务攻击探测及实现自动化邮件告警
T-pot平台的Honeytrap可观察针对TCP或UDP服务的攻击,作为一个守护程序模拟一些知名的服务,并能够分析攻击字符串,执行相应的下载文件指令,当不产生TCP或者UDP协议的时候Honeytr ...
- python 图片上添加文字
import PIL from PIL import ImageFont from PIL import Image from PIL import ImageDraw #设置字体,如果没有,也可以不 ...
- Linux 下配置Tomcat的虚拟路径
如果你的Linux服务器下,不止一个tomcat的时候,这个时候,你就会发现,每次去发布项目很麻烦,还需要到webapps下面去看,繁琐的很,这里就用到了,Tomcat的虚拟路径,制定一个目录,作为t ...
- 【iCore4 双核心板_ARM】例程十二:通用定时器实验——定时点亮LED
实验原理: 通过STM32的三个GPIO口来驱动LED灯的三个通道,设定GPIO为推挽输出模式,采 用灌电流的方式与LED连接,输出高电平LED灭,输出低电平LED亮,通过通用定时器TIM3 实现50 ...
- CentOS5.x、CentOS6.x 使用NFS及mount实现两台服务器间目录共享
一.环境介绍: 服务器:centos 192.168.1.225 客户端:centos 192.168.1.226 二.安装: NFS的安装配置:centos 5 : portmap:实现RPC(协议 ...
- js 上一步 下一步 操作
<a id="syb" href="#" style="display: block;" class="btn button ...
- 【HTTPS】自签CA证书 && nginx配置https服务
首先,搭建https服务肯定需要一个https证书.这个证书可以看做是一个应用层面的证书.之所以这么说是因为https证书是基于CA证书生成的.对于正式的网站,CA证书需要到有资质的第三方证书颁发机构 ...
- 关于Unity中NGUI的背包实现之Scrollview(基于Camera)
基于UIPanel的scrollview实现方式在移动设备上的性能不如基于camera的方式.因为UIPanel的scrollview实现方式要渲染很多的道具图,性能自然就降低了.如果是用第二个摄像机 ...
- 【消灭代办】第1周 - 敏感词判断、图片206、parseInt
11.16代办一:[敏感词判断] 代办描述: 一堆字符串组成的数组,给你一个字符串,让你去查找这个字符串是否在这个数组当中? 关键考点: 数组匹配,看一个数组中有没有这个字符串. 解决思路: 遍历数组 ...