zoukankan      html  css  js  c++  java
  • Git 子模块:git submodule

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

    color{red}{注意:上面的操作的都 master 分支,无法操作其他分支}

    使用下面的方式,更新 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 工具 - 子模块

  • 相关阅读:
    一个用于录制用户输入操作并实时回放的小工具
    Ubuntu 14.04 下安装wiznote客户端
    lombok @EqualsAndHashCode 注解的影响
    初始化数据库和导入数据
    com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定
    fastjson如何指定字段不序列化
    Mybatis 查询tinyint(1)的数据库字段时会自动转换成boolean类型
    Maven中settings.xml的配置项说明
    logback的使用和logback.xml详解
    解决Eureka Server不踢出已关停的节点的问题
  • 原文地址:https://www.cnblogs.com/cute/p/10007508.html
Copyright © 2011-2022 走看看