本文转自:https://blog.csdn.net/qq_37788558/article/details/78668345

实例代码: 父项目:https://github.com/jjz/pod-project 子项目:https://github.com/jjz/pod-library

使用场景

基于公司的多项目,我们提取了一个公共的类库提供给多个项目使用,但是这个library怎么和git在一起方便的管理呢? 需要解决以下的几个问题:

  • 如何在git项目中导入library库?
  • library库在其他的项目中被修改了如何push?
  • 其他项目如何获取到library库最新的提交?
  • 如何在clone的时候能够自动导入library库?

解决以上问题,我使用git 的Submodule来解决。

什么是Submodule?

git Submodule 是一个很好的项目协作工具,他允许类库项目做为repository,子项目做为一个单独的git项目存在父项目中,子项目可以有自己的独立的commit,push,pull。而父项目以Submodule的形式包含子项目,父项目可以指定子项目header,父项目中会提交 Submodule的信息,在clone父项目的时候可以把Submodule初始化。

在项目中添加Submodule

git submodule add git@github.com:jjz/pod-library.git pod-library

使用 git status命令可以看到

  1.  
    git status
  2.  
     
  3.  
     
  4.  
    On branch master
  5.  
    Changes to be committed:
  6.  
     
  7.  
    new file: .gitmodules
  8.  
    new file: pod-library

多了两个需要提交的文件
gitmodules 内容

  1.  
    [submodule "pod-library"]
  2.  
    path = pod-library
  3.  
    url = git@github.com:jjz/pod-library.git

这里记录了子项目的目录和子项目的git信息

  1.  
    pod-libray
  2.  
    Subproject commit 4ac42d2f8b9ba0c2f0f2f2ec87ddbd529275fea5

这里是子项目的commit的id,git并不会记录Submodule的文件变动,它是按照这个commit的git来对比Submodule的变动的

这两个文件都需要提交到父项目的git中

我们还可以这样添加Submodule

  1.  
    git add .gitmodules pod-ibrary
  2.  
    git commit -m "pod-library submodule"
  3.  
    git submodule init

修改提交Submodule

首先要确认有对Submodule的commit权限
进入Submodule目录里面,对修改的文件进行提交

cd pod-library/

我们修改了其中的一个文件看下文件的变动

  1.  
    git status
  2.  
     
  3.  
    modified: pod-library/UseAFHTTP.h

commit submodule

git commit -a -m'test submodule'

push 到远端
>git push

然后再回到父目录:

  1.  
    cd ..
  2.  
    git status
  3.  
    on branch master
  4.  
     
  5.  
     
  6.  
    modified: pod-library (new commits)

可以看到pod-library已经变更为最新的commit id

Subproject commit 330417cf3fc1d2c42092b20506b0d296d90d0b5f
我们需要把推送到父项目的远端

  1.  
    git commit -m'update submodule'
  2.  
    git push

更新Submodule

更新的方法有两种:

  • 在父项目的目录下运行

git submodule foreach git pull

  • 在Submodule的目录下面更新

    cd pod-library
    git pull

注意更新Submodule的时候如果有新的commit id产生,需要在父项目产生一个新的提交,pod-libray文件中的 Subproject commit会变为最新的commit id

在clone的时候初始化Submodule

  • 采用递归参数 --recursive

git clone git@github.com:jjz/pod-project.git --recursive

  1.  
    loning into 'pod-project'...
  2.  
    remote: Counting objects: 57, done.
  3.  
    remote: Compressing objects: 100% (45/45), done.
  4.  
    remote: Total 57 (delta 13), reused 49 (delta 8), pack-reused 0
  5.  
    Receiving objects: 100% (57/57), 18.79 KiB | 0 bytes/s, done.
  6.  
    Resolving deltas: 100% (13/13), done.
  7.  
    Checking connectivity... done.
  8.  
    Submodule 'pod-library' (git@github.com:jjz/pod-library.git) registered for path 'pod-library'
  9.  
    Cloning into 'pod-library'...
  10.  
    remote: Counting objects: 34, done.
  11.  
    remote: Compressing objects: 100% (25/25), done.
  12.  
    remote: Total 34 (delta 8), reused 30 (delta 7), pack-reused 0
  13.  
    Receiving objects: 100% (34/34), 12.95 KiB | 0 bytes/s, done.
  14.  
    Resolving deltas: 100% (8/8), done.
  15.  
    Checking connectivity... done.
  16.  
    Submodule path 'pod-library': checked out '330417cf3fc1d2c
  17.  
     
  18.  
    42092b20506b0d296d90d0b5f'

会自动init Submodule

或者使用第二种方法
先clone父项目

git clone git@github.com:jjz/pod-project.git
cd pod-project
git submodule init

  1.  
    Submodule 'pod-library' (git@github.com:jjz/pod-library.git)
  2.  
    registered for path 'pod-library'

git submodule update

  1.  
    Cloning into 'pod-library'...
  2.  
    remote: Counting objects: 34, done.
  3.  
    remote: Compressing objects: 100% (25/25), done.
  4.  
    remote: Total 34 (delta 8), reused 30 (delta 7), pack-reused 0
  5.  
    Receiving objects: 100% (34/34), 12.95 KiB | 0 bytes/s, done.
  6.  
    Resolving deltas: 100% (8/8), done.
  7.  
    Checking connectivity... done.
  8.  
    Submodule path 'pod-library': checked out '330417cf3fc1d2c42092b20506b0d296d90d0b5f'

删除Submodule

git 并不支持直接删除Submodule需要手动删除对应的文件

  1.  
    cd pod-project
  2.  
    git rm --cached pod-library
  3.  
    rm -rf pod-library
  4.  
    rm .gitmodules
  5.  
     
  6.  
    vim .git/config
  7.  
    [submodule "pod-library"]
  8.  
    url = git@github.com:jjz/pod-library.git
  9.  
    删除submodule相关的内容
  10.  
    git commit -a -m 'remove pod-library submodule'

作者:姜家志
链接:http://www.jianshu.com/p/d433d3417a19
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

[转]使用Git Submodule管理子模块的更多相关文章

  1. 使用Git Submodule管理子模块

    转自:https://segmentfault.com/a/1190000003076028 使用场景 基于公司的项目会越来越多,常常需要提取一个公共的类库提供给多个项目使用,但是这个library怎 ...

  2. 转:Git Submodule管理项目子模块

    使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone ...

  3. Git Submodule管理项目子模块

    使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone ...

  4. git submodule 管理子项目

    使用场景 拆分项目,当项目越来越大之后,我们希望 子模块 可以单独管理,并由 专门 的人去维护,这个时候只可以使用 git submodule 去完成. 常用命令 git clone <repo ...

  5. 使用git submodule管理一个需要多个分立开发或者第三方repo的项目

    在项目开发中,特别是web前端开发中,有非常多的开源第三方library,我们希望引用他们,同时也希望能够方便地保持这些第三方 开源repo的更新.另外一方面如果我们自己在开发一个网站的项目,这个项目 ...

  6. git submodule的使用

    1.在项目中使用Submodule 为当前工程添加submodule,命令如下:git submodule add 仓库地址 路径仓库地址:是指子模块仓库地址URL.路径:指将子模块放置在当前工程下的 ...

  7. Git submodule 子模块的管理和使用

    因为代码分了两个小组管理,一部分代码使用跨平台语言实现,一部分使用原生实现. 所以使用Git submodule 来进行管理. 1,查看/更新 子模块 $ git submodule add ssh: ...

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

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

  9. Git submodule - 子模块【转】

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

随机推荐

  1. 03 of learning python

    01 input输入的是str类型 如果输入的是数字的话,要记得强制转换一下! 02 isdigit() 这个方法是用来检测字符串是否全部由数字组成 str.isdigit() 如果字符串只包含数字则 ...

  2. IO在Socket中的应用

    一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个连接 ...

  3. TCP/IP(八)之总结TCP/IP四层模型

    阅读目录(Content) 一.TCP/IP参考模型概述 1.1.TCP/IP参考模型的层次结构 二.TCP/IP四层功能概述 2.1.主机到网络层 2.2.网络互连层 2.3.传输层 2.3.应用层 ...

  4. SQL Server对比两字符串的相似度(函数算法)

    一.概述    最近有人问到关于两个字符串求相似度的函数,所以就写了本篇文章,分别是“简单的模糊匹配”,“顺序匹配”,“一对一位置匹配”.在平时的这种函数可能会需要用到,业务需求不一样,这里只给出参照 ...

  5. zookeeper集群配置详细教程

      第一步:环境准备 环境 版本 说明 JDK 1.8 zookeeper运行所需 centos 7 操作系统 需要配置好JDK的环境变量 zookeeper-3.4.9.tar.gz 3.4.9 z ...

  6. 王垠的40行代码,究竟diao在哪里

    王垠是谁? 不用我说了吧!!! 别傻谈,亮码瞧! ;; A simple CPS transformer which does proper tail-call and does not;; dupl ...

  7. Android NDK学习(七):NDK 编译支持 C++特有的库

    如果你的C++代码中出现了很多C++特有的库,例如<iostream>,<list>等,那么你还需要在jni的文件夹下添加一个Application.mk文件,文件内容为: A ...

  8. Android精通之Handler讲解

    版权声明:未经博主允许不得转载 一:简介 [达叔有道]软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family ...

  9. Python学习笔记【第十四篇】:Python网络编程二黏包问题、socketserver、验证合法性

    TCP/IP网络通讯粘包问题 案例:模拟执行shell命令,服务器返回相应的类容.发送指令的客户端容错率暂无考虑,按照正确的指令发送即可. 服务端代码 # -*- coding: utf- -*- # ...

  10. react中的refs

    概述 很久之前就知道refs,感觉好神秘,恰好今天突然发现字符串形式的ref在官网不推荐使用了,于是好好总结一下ref的用法,供以后开发时参考,相信对其他人也有用. 参考资料: Refs & ...