当前位置:   article > 正文

git 嵌套使用:Submodule

git 嵌套

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>  # 添加子项目
  • 1

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

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

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

  1. [submodule "leon_widget"]
  2. path = leon_widget
  3. url = git@gitee.com:lckj686/leon_widget.git
  • 1
  • 2
  • 3

场景二,主工程和 sub模块一起拉

git clone --recurse-submodules <main_project_url>  # 获取主项目和所有子项目源码
  • 1
  1. PS D:\work\vv_official\test\test5> git clone --recurse-submodules git@gitee.com:lckj686/custom_app.git
  2. Cloning into 'custom_app'...
  3. remote: Enumerating objects: 116, done.
  4. remote: Counting objects: 100% (116/116), done.
  5. remote: Compressing objects: 100% (93/93), done.
  6. Receiving objects: 76% (89/116)used 0 (delta 0)R
  7. Receiving objects: 100% (116/116), 129.91 KiB | 437.00 KiB/s, done.
  8. Resolving deltas: 100% (16/16), done.
  9. Submodule 'leon_widget' (git@gitee.com:lckj686/leon_widget.git) registered for path 'leon_widget'
  10. Cloning into 'D:/work/vv_official/test/test5/custom_app/leon_widget'...
  11. remote: Enumerating objects: 40, done.
  12. remote: Counting objects: 100% (40/40), done.
  13. remote: Compressing objects: 100% (28/28), done.
  14. remote: Total 40 (delta 8), reused 0 (delta 0)
  15. Receiving objects: 100% (40/40), 6.70 KiB | 979.00 KiB/s, done.
  16. Resolving deltas: 100% (8/8), done.
  17. Submodule path 'leon_widget': checked out '7ec79d2c32304e602379b0dd94934fed5d91b6a1'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

场景三,先拉主工程,在主工程中直接拉 sub模块,主工程已经配置好sub

git submodule update --init --recursive
  • 1

注意:

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

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

    1. D:\work\vv_official\test\custom_app\leon_widget>git branch -a
    2. * (HEAD detached at 7ebe0f2)
    3. master
    • 1
    • 2
    • 3
  • 在本诉求中,子模块在实际使用中会有多分支或者多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中删除。

  1. 删除一个submodule
  2. 1.删除 .gitsubmodule中对应submodule的条目
  3. 2.删除 .git/config 中对应submodule的条目
  4. 3.执行 git rm --cached {submodule_path}。注意,路径不要加后面的“/”。例如:你的submodule保存在 supports/libs/websocket/ 目录。执行命令为: git rm --cached supports/libs/websocket
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

参考资料

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/617550
推荐阅读
  

闽ICP备14008679号