1. 在项目中添加子模块

命令: git submodule add <url>

例子: git submodule add https://github.com/chaconinc/DbConnector

此命令在当前工作目录添加了一个名为"DbConnector"的子模块,且子模块地址为:https://github.com/chaconinc/DbConnector,另外这条命令会在当前工作文件夹添加两个文件.gitmodulesDbConnector

然后你可以将本次的添加子模块的动作提交并推送到仓库:

$ git commit -m 'added DbConnector module'
$ git push origin master

2. 克隆含有子模块的项目

命令:

$ git clone https://github.com/chaconinc/MainProject
$ git submodule init
$ git submodule update

第一条命令会将主项目的内容克隆下来,但是子模块DbConnector的内容不会被克隆。第二条命令是用来初始化本地配置文件,而第三条命令才是抓取子模块对应远程仓库的内容。

可以将上述三条命令合并成一条:

$ git clone --recurse-submodules https://github.com/chaconinc/MainProject

也可以将三条命令合并成两条:

$ git clone https://github.com/chaconinc/MainProject
$ git submodule update --init

3. 在包含子模块的项目上工作

经过上面的clone,在本地已经有了一个包含子模块的项目的副本,如何同时在主项目和子模块项目上与队员协作?

3.1 从子模块的远端拉取上游修改

命令:

  • 手动拉取并合并(子模块目录下)

    $ git fetch
    $ git merge origin/master

    此时提交,子模块就会锁定为其他人更新时的新代码。

  • 自动拉取合并(主项目目录下)

    $ git submodule update --remote

    此命令会默认拉取子模块仓库的master分支,也可以设置为想要的其他分支。

    此时,在主项目目录下运行git status,Git会显示子模块有“新提交”。

3.2 从主项目远端拉取上游更改

命令:

$ git pull
$ git submodule update --init --recursive

第一条命令会递归地抓取子模块的更改,但是不会更新子模块。此时运行git status,Git会显示子模块“已修改”且“有新的提交”,其实这些更改和提交已经在MainProject中有了记录,只是没有在本地的子模块中记录而已,所以需要更新子模块,因此需要使用第二条命令,此时再运行git status则不会再有上述的提示。

上述命令也可以合并为一条:

$ git pull --recurse-submodules

此命令会自动完成子模块的更新工作。

3.3 在子模块上工作

命令:

1. $ cd DbConnector
2. $ git checkout stable
3. $ cd ..
4. $ git submodule update --remote --merge
5. $ cd DbConnector/
6. $ vim src/db.c
7. $ git commit -am 'unicode support'
8. $ cd ..
9. $ git submodule update --remote --rebase

第1行:进入到子模块目录

第2行:切换到子模块中的stable分支

第3行:主目录

第4行:拉取子模块上游更改并合并到本地

第5行:进入到子模块目录

第6行:创建db.c

第7行:提交本地更改

第8行:进入主目录

第9行:再次拉取上游更新并合并到本地

第9行中如果忘记了添加--rebase/--merge,GIt会将子模块更新为服务器上的状态。此时需要回到子模块目录中再次检出你的分支,然后手动合并或变基。

如果没有及时提交本地修改,即没有执行第7行,直接进行了8,9,那也不要紧,此时Git会只抓取更改而并不会覆盖子模块目录中没有保存的工作。

如果运行第9行时出现冲突,像往常一样解决冲突即可。

3.4 发布子模块改动

现在子模块目录中有一些改动(一些是通过更新从上游引入的,另一些是本地生成的)。如果我们在主项目中提交并推送但并不推送子模块上的改动,其他尝试检出我们修改的人就会遇到麻烦,他们无法得到依赖的子模块的改动。

命令(主目录下):

$ git push --recurse-submodule=check
$ git push --recurse-submodule=on-demand

第一条命令会在推送主项目之前检查所有子模块是否已经推送,如果有任何提交的子模块没有推送,那么推送就会失败。

第二条命令会在推送主项目之前检查所有子模块是否已经推送,如果有任何子模块没有推送,那么推送之,直至所有子模块推送完毕,再推送主项目。再此期间,任何子项目推送失败都会导致主项目推送失败。

git子模块的使用的更多相关文章

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

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

  2. Git 子模块:git submodule

    imtianx 2018年03月08日阅读 2057 Git 子模块:git submodule 工作中,可能会遇到在一个Git仓库 中添加 其他 Git 仓库的场景.比如,在项目中引用第三方库.或者 ...

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

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

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

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

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

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

  6. Git 子模块 - submodule

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

  7. Git 子模块 - submodule(转)

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

  8. git 子模块

    为了方便各个子模块独立开发,或使用第三方不断更新的仓库,可以使用子模块来引用. 子模块对应的源码是子模块仓库的克隆. git submodule 与 subtree对比 git submodule 允 ...

  9. git子模块submodule

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

  10. git子模块使用

    如下项目有多个标红的子模块 1.首先进入每个子模块目录,init初始化子模块仓库,然后提交远程. 2.在每个子目录都初始化好仓库后,进入lv-qggz主目录,只初始化该仓库,然后依次添加子模块的仓库地 ...

随机推荐

  1. ClassCastException: java.util.Date cannot be cast to java.sql.Date

    解决办法 /** * 单个方法,作用,根据输入的day:yyyy-mm-dd格式的字符日期,将数据库中的该天所有数据更新为0 * 0表示假期 * @param day * @throws SQLExc ...

  2. 【C++】自定义数据类型

    自定义数据类型 标签:c++ 目录 自定义数据类型 一.结构体 定义方法: 特点: 成员访问方式: 初始化: 结构数组 指针和动态内存分配: 结构变量作为函数参数: 二.联合 定义方法: 特点: 举例 ...

  3. GitHub pages+自定义域名(腾讯云域名)+cloudflare加速

    本人也是第一次走完整个流程,github pages当然一直有使用,创建也很简单,并且网上教程也比较多:然后是关于自定义域名的问题,自己以前使用过国外的免费域名,然后是直接修改就ok了,然后这次使用了 ...

  4. 第01讲:Flink 的应用场景和架构模型

    你好,欢迎来到第 01 课时,本课时我们主要介绍 Flink 的应用场景和架构模型. 实时计算最好的时代 在过去的十年里,面向数据时代的实时计算技术接踵而至.从我们最初认识的 Storm,再到 Spa ...

  5. Vue之 css3 样式重置 代码

    reset.css @charset "utf-8";html{background-color:#fff;color:#000;font-size:12px} body,ul,o ...

  6. stram流char[]保存,支持中文,Filestram需要先转byte[]才能使用,但是性能更好《转载》

    学习流的使用时(stream类),逐步遇到新的理解,记录一下 1.FileStream流是处理byte[],默认UTF8类型 当你使用wirte方法时将非byte类型的输入内容,先将内容通过转换为字节 ...

  7. 一行代码为UITextField添加收键盘功能

    iOS开发中收键盘是十分常用的功能,只需一行代码即可为ViewController添加工具条收键盘功能 更重要的是使用catogory,无代码污染. 代码 // UITextField+keyboar ...

  8. CocoaPods使用专题 by h.l

    cocoaPods安装 CocoaPods安装和使用教程(code4app) cocoapods使用问题解决 cocoapods慢如何解决? CocoaPods停在Analyzing dependen ...

  9. IP地址与子网划分

    IP地址与子网划分 目录 IP地址与子网划分 一.IP地址(Internet Protocol Address) 1.IP地址的表示 2.IP地址的组成 3.IP地址的分类 (1)A类IP地址 (2) ...

  10. 使用Docker安装ElasticSearch和可视化界面Kibana【图文教学】

    一.前言 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java语言开发的,并 ...