[转]使用Git Submodule管理子模块

本文转自: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 [email protected]: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 [email protected]: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‘ ([email protected]: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 [email protected]: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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/freeliver54/p/10161726.html

时间: 2024-10-08 10:59:34

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

Git Submodule管理项目子模块

使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone <repository> --recursive 递归的方式克隆整个项目 git submodule add <repository> <path> 添加子模块 git submodule init 初始化子模块 git submodule update 更新子模块 gi

git submodule 管理子项目

使用场景 拆分项目,当项目越来越大之后,我们希望 子模块 可以单独管理,并由 专门 的人去维护,这个时候只可以使用 git submodule 去完成. 常用命令 git clone <repository> --recursive # 递归方式克隆整个项目 git submodule add <repository> path # 添加子模块 git submodule init # 初始化子模块 git submodule update # 更新子模块 git submodul

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

在项目开发中,特别是web前端开发中,有非常多的开源第三方library,我们希望引用他们,同时也希望能够方便地保持这些第三方 开源repo的更新.另外一方面如果我们自己在开发一个网站的项目,这个项目一般分为前端和后端两个相对独立的子项目,特别是前端的repo可能在不同的项目中共享,那么这时,你就可能希望将项目分开为前端和后端两个repo,如何管理这种情况呢?一个比较好的方案就是使用git的submodule功能. 假设我们的父repo在prepo目录,sumodule newtestrepo希

git submodule获取子模块

从github上获取工程,经常会出现依赖其它github上代码的情况,这时如果每一个都手动下载,实在太麻烦了.其实git给我们提供了相互引用的功能,可以在工程中直接引入其它的代码库,这样可以保证每次使用的子模块也都是最新的. git clone https://github.com/Kjuly/iPokeMon.gitgit submodule initgit submodule update

git之git submodule

git之git submodule 场景一 在本地仓库中,添加远程仓库作为子仓库. 添加submodule工程 git submodule add XXX.git 在本地仓库中,添加一个空仓库作为子仓库 git add .gitmodules (sumodule-name) git commit git submodule init 提交submodule修改 如果修改了submodule仓库的内容 git status git add . git commit git push 然后在主仓库中

git submodule 管理子工程

摘要:当多人共同维护一个项目时,必然需要进行模块化开发,所以使用submodule来管理子工程很有必要.本文以图文并貌的形势进行一步步搭建主工程及绑定子工程. 1.在Github上分别建立主工程HDMasterProject和两个子工程(动态/静态库)HDSubProjectOne.HDSubProjectTwo. SZ-denglibing:~ fangdd$ cd /Harry/Projects/HDMaster-SubProject/HDMasterProject SZ-denglibin

Git 子模块:git submodule

imtianx 2018年03月08日阅读 2057 Git 子模块:git submodule 工作中,可能会遇到在一个Git仓库 中添加 其他 Git 仓库的场景.比如,在项目中引用第三方库.或者在模块化开发中,某些公共的模块是需要单独维护的,使用单独的仓库比较方便,但是在项目中需要引用,就会出现这样的场景.这里使用 Git 的 git submodule 命令为一个 git 项目 添加 子git项目. 可以使用 git submodule --help 查看所有相关命令. 为了方便说明,这

Git submodule 拉取子模块

$ git clone https://code.vipkid.com.cn/Classroom-Core/PCClient/vipkid-pc-client.git Cloning into 'vipkid-pc-client'... Username for 'https://code.vipkid.com.cn': zhangguangming1 remote: HTTP Basic: Access denied remote: You must use a personal access

git submodule的使用

开发过程中,经常会有一些通用的部分希望抽取出来做成一个公共库来提供给别的工程来使用,而公共代码库的版本管理是个麻烦的事情.今天无意中发现了Git的git submodule命令,之前的问题迎刃而解了. 添加 为当前工程添加submodule,命令如下: git submodule add 仓库地址 路径 其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径.  注意:路径不能以 / 结尾(会造成修改不生效).不能是现有工程已有的目录(不能順利 Clone) 命令执行完成,会在当