imtianx

2018年03月08日阅读 2057

Git 子模块:git submodule

工作中,可能会遇到在一个Git仓库 中添加 其他 Git 仓库的场景。比如,在项目中引用第三方库。或者在模块化开发中,某些公共的模块是需要单独维护的,使用单独的仓库比较方便,但是在项目中需要引用,就会出现这样的场景。这里使用 Git 的 git submodule 命令为一个 git 项目 添加 子git项目

可以使用 git submodule --help 查看所有相关命令。 为了方便说明,这里在主项目 MainProject中加两个子模块 libalibb .

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 中存放的为子模块的信息,使用 catvim查看内容为:

[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
复制代码

使用下面的方式,更新 libbdev 分支:

git config -f .gitmodules submodule.liba.branch dev
git submodule update --remote
复制代码

如下图:

这里对 .gitmodules 加了 -f 参数,修改提交后对所有用户有效。

3. 删除子模块

在日常开发中,有添加,当然也会有删除 子模块的需求。 这里主项目包含两个子模块:libalibb,以删除 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的更多相关文章

  1. Git 子模块 - submodule

    有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另 ...

  2. Git 子模块 - submodule(转)

    原文地址: http://www.cnblogs.com/kelsen/p/5918672.html 有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开 ...

  3. git子模块submodule

    添加submodule: git submodule add 子模块git地址  把这个module放置的文件夹(这个文件夹须事先不存在) git submodule add http://xxx.x ...

  4. 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 子模块 有种情况我们经常 ...

  5. git submodule git 子模块管理相关操作

    Git 子模块操作相关的一些命令备忘: # 当使用git clone下来的工程中带有submodule时,初始的时候 submodule的内容并不会自动下载下来的,需执行如下命令: git submo ...

  6. Git子模块引用外部项目

    Git子模块(submodule)简介 经常有这样的事情,当你在一个项目上工作时,你需要在其中使用另外一个项目.也许它是一个第三方开发的库或者是你独立开发和并在多个父项目中使用的.这个场景下一个常见的 ...

  7. jenkin+Git子模块自动拉取代码

    jenkins+Git子模块自动拉取代码 添加Git子模块 先克隆想要添加子模块的仓库git clone ssh://git@ip:port/user/project.git,这个是主目录. 进入仓库 ...

  8. 手把手教你把 Git 子模块更新到主项目

    本文以 skywalking-rocketbot-ui子模块合并到 skywalking 为例,手把手教你如何把 Git 子模块更新到主项目中去. 首先,把fork的skywalking项目克隆到本地 ...

  9. git子模块的使用

    1. 在项目中添加子模块 命令: git submodule add <url> 例子: git submodule add https://github.com/chaconinc/Db ...

随机推荐

  1. Spark 核心篇-SparkContext

    本章内容: 1.功能描述 本篇文章就要根据源码分析SparkContext所做的一些事情,用过Spark的开发者都知道SparkContext是编写Spark程序用到的第一个类,足以说明SparkCo ...

  2. VisualSVN Server 配置和使用

    以前使用官方Subversion搭建SVN版本控制环境,很繁琐.在Windows 系统上,要想让它随系统启动,就要封装SVN Server为windws service,还要通过修改配置文件来控制用户 ...

  3. 【测量实战技术】Cad中导入坐标高程点并可以提取坐标带高程

    一般咱们都是导入cad的是坐标不带高程,那么怎么在cad中导入坐标高程的三维坐标呢,在不需要cass的情况下还能计算方量呢?而且还能批量提取出这些坐标高程的三维参数. 这些都是工作中非常常用的技能,不 ...

  4. STM32 ADC 采样 频率的确定

    一 STM32 ADC 采样频率的确定 1.       : 先看一些资料,确定一下ADC 的时钟: (1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步.CLK 控制器为A ...

  5. iOS系统及客户端软件测试的基础介绍

    iOS系统及客户端软件测试的基础介绍 iOS现在的最新版本iOS5是10月12号推出,当前版本是4.3.5 先是硬件部分,采用iOS系统的是iPad,iPhone,iTouch这三种设备,其中iPho ...

  6. 使用apktool.jar工具反编译和回编译Android APK 终端命令模式

    1.工具准备 工具可以网上搜索下载新版本,也可以从这里Download:https://github.com/FlymeOS/tools/blob/lollipop-5.1/reverses/apkt ...

  7. OSI网络体系结构

    为把在一个网络结构下开发的系统与在另一个网络结构下开发的系统互连起来,以实现更高一级的应用,使异种机之间的通信成为可能,便于网络结构标准化,国际标准化组织(ISO)于1983年形成了开放系统互连基本参 ...

  8. Zookeeper系列二:分布式架构详解、分布式技术详解、分布式事务

    一.分布式架构详解 1.分布式发展历程 1.1 单点集中式 特点:App.DB.FileServer都部署在一台机器上.并且访问请求量较少 1.2  应用服务和数据服务拆分  特点:App.DB.Fi ...

  9. Asp.net常用的三十多个代码(非常实用)

    1.//弹出对话框.点击转向指定页面 Response.Write("<script>window.alert('该会员没有提交申请,请重新提交!')</script> ...

  10. firadisk 把 win7(32位) 装入 VHD :仅仅支持内存模式:--mem

    关键1:对于 win7(32位)来说,还可以在设备管理器内,通过添加“过时”硬件的方式导入wvblk驱动. 附件: grub4dos firadisk驱动