git 嵌套使用:Submodule

git 嵌套使用:Submodule

一、概述

诉求:希望把一个lib做成maven 的效果,各个工程都可以依赖,实现复用。 但是maven 独立项目的特点决定了他的开发成本和维护成本都比较高。

  • 方案一:lib 随工程走,阶段性的用 beyond compare 这类比较器同步,通过手动的方式阶段性的维护一个 复用库。

    优点: 首次操作简单

    缺点:不好同步,后期会懒得同步,都是手动

  • 方案二:使用git 技巧。在项目工程中希望,其中一个library 工程,既属于本工程, 又属于另一个独立的git项目。 把该library 作为一个 独立的lib进行维护,方便与其他工程复用。

本文围绕方案二阐述。

二、git嵌套 submodule的使用

经过琢磨 git submodule 可以满足方案二
应本文述求,构建场景:

  • lib_widget 作为复用库,链接为ssh@widget
  • 主工程项目,链接为 ssh@app
场景一,已经在使用主工程了,在主工程中添加 lib_widget 作为sub模块
git submodule add <submodule_url>  # 添加子项目

添加完,会自动下载 widget 里的代码。

   PS D:\work\vv_official\test> git submodule add git@gitee.com:lckj686/leon_widget.git
    Cloning into 'D:/work/vv_official/test/leon_widget'...
    remote: Enumerating objects: 37, done.
    remote: Counting objects: 100% (37/37), done.
    Receiving objecting objects: 100% (25/25), done.
    remote: Total 37 (delta 6), reused 0 (delta 0)
    Receiving objects: 100% (37/37), 6.50 KiB | 2.17 MiB/s, done.
    Resolving deltas: 100% (6/6), done.

在工程的git根目录可以看到子模块的描述文件 .gitmodules

   [submodule "leon_widget"]
    path = leon_widget
    url = git@gitee.com:lckj686/leon_widget.git
场景二,主工程和 sub模块一起拉
git clone --recurse-submodules <main_project_url>  # 获取主项目和所有子项目源码
PS D:\work\vv_official\test\test5> git clone --recurse-submodules git@gitee.com:lckj686/custom_app.git
Cloning into 'custom_app'...
remote: Enumerating objects: 116, done.
remote: Counting objects: 100% (116/116), done.
remote: Compressing objects: 100% (93/93), done.
Receiving objects:  76% (89/116)used 0 (delta 0)R
Receiving objects: 100% (116/116), 129.91 KiB | 437.00 KiB/s, done.
Resolving deltas: 100% (16/16), done.
Submodule 'leon_widget' (git@gitee.com:lckj686/leon_widget.git) registered for path 'leon_widget'
Cloning into 'D:/work/vv_official/test/test5/custom_app/leon_widget'...
remote: Enumerating objects: 40, done.
remote: Counting objects: 100% (40/40), done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 40 (delta 8), reused 0 (delta 0)
Receiving objects: 100% (40/40), 6.70 KiB | 979.00 KiB/s, done.
Resolving deltas: 100% (8/8), done.
Submodule path 'leon_widget': checked out '7ec79d2c32304e602379b0dd94934fed5d91b6a1'

**注意:**看是两个工程的分别clone

场景三,先拉主工程,在主工程中直接拉 sub模块,主工程已经配置好sub
git submodule update --init --recursive
注意:

如果用命令行操作sub模块,要先cd到模块目录。

  • 场景一的方式拉到的子模块,添加完子模块。子模块默认header -> master分支
PS D:\work\vv_official\test\leon_widget> git branch
* master
  • 场景二,和场景三 拉到的子模块,子模块默认是没有指向分支。要自己手动checkout 到目标分支

    D:\work\vv_official\test\custom_app\leon_widget>git branch -a
    * (HEAD detached at 7ebe0f2)
      master
    
  • 在本诉求中,子模块在实际使用中会有多分支或者多tag,要注意指定和切换分支。 子模块的分支与merge 操作与git 的普通操作一样。

四、使用可视化工具直观查看

4.1、通用工具查看
  1. 在主工程中通过二中的方式拉到了submodule 可以用sourcetree 查看。 可以看到sub模块

    

  1. 在git 的远程仓库直接查看(这里以码云为例子)
4.2、针对Android的 Android studio 3.4.1 可以很直观的看到sub模块的状态
  1. 点开as的git概要图


2. 查看当前文件所处的 仓库/分支

  1. sub模块的文件 修改完 commit 没问题, push 的时候要注意一下, 要push到自己的远程地址。

五、git删除sub模块

首先,要在“.gitmodules”文件中删除相应配置信息。然后,执行“git rm –cached ”命令将子模块所在的文件从git中删除。

删除一个submodule
1.删除 .gitsubmodule中对应submodule的条目

2.删除 .git/config 中对应submodule的条目

3.执行 git rm --cached {submodule_path}。注意,路径不要加后面的“/”。例如:你的submodule保存在 supports/libs/websocket/ 目录。执行命令为: git rm --cached supports/libs/websocket 

参考资料

Git Tools - Submodules
submodule删除更新
submodule使用

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值