likes
comments
collection

Git submodule 子模块的管理和使用

作者站长头像
站长
· 阅读数 51

基础教程类,git submodule,对于公司内部项目/模块,使用比较方便

一、背景:

经常碰到这种情况:

  1. 当你在一个Git 项目上工作时,你需要在其中使用另外一个Git 项目。也许它是一个第三方开发的Git 库或者是你独立开发和并在多个父项目中使用的。这个情况下一个常见的问题产生了:你想将两个项目单独处理但是又需要在其中一个中使用另外一个。
  2. 例如SDK短期内变动较多,若使用npm管理,依赖到的项目需要频繁升级npm包,所以npm管理不太灵活。

二、方案:

  1. 在Git 中你可以用子模块submodule来管理这些项目,submodule允许你将一个Git 仓库当作另外一个Git 仓库的子目录。这允许你克隆另外一个仓库到你的项目中并且保持你的提交相对独立。优点如下:

    1. 依赖到的项目只需要git pull就能更新到最新
    2. 修改/调试方便

3、使用:

3.1 添加子模块

此文中统一将远程项目https://XXX.git克隆到本地assets文件夹。

git submodule add https://XXX.git assets

添加子模块后运行git status, 可以看到目录有增加1个文件.gitmodules, 这个文件用来保存子模块的信息。

git status
On branch master
Initial commit 
Changes to be committed: 
    (use "git rm --cached <file>..." to unstage)     
        new file:   .gitmodules     
        new file:   assets

3.2 查看子模块

git submodule
e33f854d3f51f5ebd771a68da05ad0371a3c0570 assets (heads/master)

3.3 更新子模块

更新项目内子模块到最新版本

git submodule update

更新子模块为远程项目的最新版本

git submodule update --remote

3.4 修改/更新子模块

在子模块中修改文件后,直接提交到远程项目分支。(到对应git项目目录,正常的git提交)

git add . 
git ci -m "commit" 
git push origin HEAD:master

3.5 克隆包含子模块的项目

克隆包含子模块的项目有二种方法:

  1. 先克隆父项目,再更新子模块;
  2. 另直接递归克隆整个项目。

4、克隆父项目,再更新子模块

  1. 克隆父项目
    $ git clone https://[parent].git assets
    
  2. 查看子模块
    $ git submodule  -abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde assets
    

子模块前面有一个-,说明子模块文件还未检入(空文件夹)

  1. 初始化子模块
    $ git submodule init Submodule 'assets' (https://[children].git) registered for path 'assets'
    
    初始化模块只需在克隆父项目后运行一次
  2. 更新子模块
    $ git submodule update 
    Cloning into 'assets'... 
    Submodule path 'assets': checked out 'abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde'
    

4.2、递归克隆整个项目

git clone https://[parent].git assets --recursive 

递归克隆整个项目,子模块已经同时更新了,一步到位。