1. 在项目中添加子模块

命令: git submodule add <url>

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

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

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

$ 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. 【刷题-LeetCode】200 Number of Islands

    Number of Islands Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. ...

  2. VictoriaMerics学习笔记(2):核心组件

    核心组件 1. 单机版 victoria-metrics-prod 单一二进制文件 读写都在一个节点上 作者推荐单机版 特性 merge方式配置 通过HTTP协议提供服务 内存限制(防止OOM) 使用 ...

  3. Cesium源码剖析---Clipping Plane

    之前就一直有写博客的想法,别人也建议写一写,但一直没有动手写,自己想了一下原因,就一个字:懒.懒.懒.为了改掉这个毛病,决定从今天开始写博客了,一方面对自己掌握的知识做一个梳理,另一方面和大家做一个交 ...

  4. Java高效开发-常用idea插件

    这里推荐几个常用的idea插件,可以大大提高开发的效率 所使用的idea版本为 2021.2.3 1.Jrebel and Xrebel for IntelliJ Jrebel用于热部署,避免频繁重启 ...

  5. elasticsearch查询之大数据集分页性能测试

    一.测试环境 python 3.7 elasticsearch 6.8 elasticsearch-dsl 7 安装elasticsearch-dsl pip install elasticsearc ...

  6. Vuex 状态管理的工作原理

    Vuex 状态管理的工作原理 为什么要使用 Vuex 当我们使用 Vue.js 来开发一个单页应用时,经常会遇到一些组件间共享的数据或状态,或是需要通过 props 深层传递的一些数据.在应用规模较小 ...

  7. svn 用户名,密码 查看/删除

    1.查看svn 的用户名,密码: 找到用户名,密码文件,都是明文的,你可以看到 例:linux ls ~/.subversion/auth/svn.simple 2ab598e9cb6d6d38761 ...

  8. JUC并发包学习

    1.什么是JUC java.util工具包.包.分类 业务:普通的线程代码 Thread Runable:没有返回值.效率相对于Callable相对较低. 2.线程和进程 进程:一个程序.如:QQ.e ...

  9. Pandas中Series与Dataframe的初始化

    (一)Series初始化 1.通过列表,index自动生成 se = pd.Series(['Tom', 'Nancy', 'Jack', 'Tony']) print(se) 2.通过列表,指定in ...

  10. Redis 源码简洁剖析 11 - 主 IO 线程及 Redis 6.0 多 IO 线程

    Redis 到底是不是单线程的程序? 多 IO 线程的初始化 IO 线程运行函数 IOThreadMain 如何推迟客户端「读」操作? 如何推迟客户端「写」操作? 如何把待「读」客户端分配给 IO 线 ...